Skip to content

Commit 0712ddc

Browse files
committed
renovation
1 parent 087875b commit 0712ddc

File tree

3 files changed

+31
-9
lines changed

3 files changed

+31
-9
lines changed

1-js/4-data-structures/12-typeof-duck-typing/article.md

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Оператор typeof и утиная типизация
1+
# Полиморфизм, typeof и утиная типизация
22

33
В этой главе мы рассмотрим, как создавать *полиморфные* функции, то есть такие, которые по-разному обрабатывают аргументы, в зависимости от их типа. Например, функция вывода может по-разному форматировать числа и даты.
44

@@ -119,6 +119,23 @@ if (x.getTime) {
119119

120120
Но как раз в этом и есть смысл утиной типизации: если объект похож на массив, у него есть методы массива, то будем работать с ним как с массивом (какая разница, что это на самом деле).
121121

122+
[smart header="Метод `Array.isArray()`"]
123+
Для массивов есть специальный метод проверки: `Array.isArray(arr)`, который возвращает `true` только если `arr` -- массив:
124+
```js
125+
//+ run
126+
alert( Array.isArray([1,2,3]) ); // true
127+
alert( Array.isArray("not array")); // false
128+
```
129+
130+
Этот метод уникален в своём роде, других аналогичных (типа `Object.isObject`, `Date.isDate`) -- нет.
131+
132+
Если нужно удостовериться, что мы получили именно массив, а не нечто похожее на него -- можно использовать `Array.isArray`. Но при этом нужно отдавать себе отчёт, что этим мы одновременно ограничиваем применимость кода: "похожие на массив" данные теперь обрабатываться не будут. Решение зависит от конкретной ситуации.
133+
[/smart]
134+
135+
136+
137+
138+
122139
## Полиморфизм
123140

124141
Пример полиморфной функции -- `sayHi(who)`, которая будет говорить "Привет" своему аргументу, причём если передан массив -- то "Привет" каждому:
@@ -127,7 +144,7 @@ if (x.getTime) {
127144
//+ run
128145
function sayHi(who) {
129146

130-
if (who.forEach) { // проверка на массив (или что-то похожее)
147+
if (Array.isArray(who)) {
131148
who.forEach(sayHi);
132149
} else {
133150
alert( 'Привет, ' + who );
@@ -140,13 +157,16 @@ sayHi("Вася"); // Привет, Вася
140157
// Вызов с массивом
141158
sayHi(["Саша", "Петя"]); // Привет, Саша... Петя
142159

143-
// Вызов с вложенными массивами
160+
// Вызов с вложенными массивами - тоже работает!
144161
sayHi(["Саша", "Петя", ["Маша", "Юля"]]); // Привет Саша..Петя..Маша..Юля
145162
```
146163

147-
Здесь вместо `splice` проверяется наличие `forEach`. Так надёжнее, поскольку именно его мы собираемся использовать.
148-
149-
Обратите внимание, получилась даже поддержка вложенных массивов. Да здравствует рекурсия!
164+
Здесь используется не "duck typing", а "жёсткая" проверка на массив. Можно было бы и поступить мягче -- проверить только наличие метода `forEach`:
165+
```js
166+
if (who.forEach) {
167+
...
168+
}
169+
```
150170

151171
## Итого
152172

1-js/4-data-structures/2-number/article.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,16 +101,17 @@ if (NaN === NaN) alert( "===" ); // не сработает
101101
```
102102

103103
</li>
104-
<li>Значение `NaN` можно проверить специальной функцией `isNaN(n)`, которая возвращает `true` если аргумент -- `NaN` и `false` для любого другого значения.
104+
<li>Значение `NaN` можно проверить специальной функцией `isNaN(n)`, которая преобразует аргумент к числу и возвращает `true`, если получилось `NaN`, и `false` -- для любого другого значения.
105105

106106
```js
107107
//+ run
108108
var n = 0 / 0;
109109

110110
alert( isNaN(n) ); // true
111+
alert( isNaN("12") ); // false, строка преобразовалась к обычному числу 12
111112
```
112113

113-
[smart]
114+
[smart header="Забавный способ проверки на `NaN`"]
114115
Отсюда вытекает забавный способ проверки значения на `NaN`: можно проверить значение на равенство самому себе, если не равно -- то `NaN`:
115116

116117
```js
@@ -122,6 +123,7 @@ if (n !== n) alert( 'n = NaN!' );
122123

123124
Это работает, но для наглядности лучше использовать `isNaN(n)`.
124125
[/smart]
126+
125127
</li>
126128
<li>Значение `NaN` "прилипчиво". Любая операция с `NaN` возвращает `NaN`.
127129

7-frames-and-windows/2-iframes/article.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Окно внутри ифрейма
1+
# Общение между окнами и фреймами
22

33
Элемент `iframe` является обычным узлом DOM, как и любой другой. Существенное отличие -- в том, что с ним связан объект `window` внутреннего окна. Он доступен по ссылке `iframe.contentWindow`.
44

0 commit comments

Comments
 (0)