You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 1-js/4-data-structures/12-typeof-duck-typing/article.md
+26-6Lines changed: 26 additions & 6 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,4 +1,4 @@
1
-
# Оператор typeof и утиная типизация
1
+
# Полиморфизм, typeof и утиная типизация
2
2
3
3
В этой главе мы рассмотрим, как создавать *полиморфные* функции, то есть такие, которые по-разному обрабатывают аргументы, в зависимости от их типа. Например, функция вывода может по-разному форматировать числа и даты.
4
4
@@ -119,6 +119,23 @@ if (x.getTime) {
119
119
120
120
Но как раз в этом и есть смысл утиной типизации: если объект похож на массив, у него есть методы массива, то будем работать с ним как с массивом (какая разница, что это на самом деле).
121
121
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
+
122
139
## Полиморфизм
123
140
124
141
Пример полиморфной функции -- `sayHi(who)`, которая будет говорить "Привет" своему аргументу, причём если передан массив -- то "Привет" каждому:
@@ -127,7 +144,7 @@ if (x.getTime) {
127
144
//+ run
128
145
functionsayHi(who) {
129
146
130
-
if (who.forEach) { // проверка на массив (или что-то похожее)
Copy file name to clipboardExpand all lines: 1-js/4-data-structures/2-number/article.md
+4-2Lines changed: 4 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -101,16 +101,17 @@ if (NaN === NaN) alert( "===" ); // не сработает
101
101
```
102
102
103
103
</li>
104
-
<li>Значение `NaN` можно проверить специальной функцией `isNaN(n)`, которая возвращает `true` если аргумент -- `NaN` и `false` для любого другого значения.
104
+
<li>Значение `NaN` можно проверить специальной функцией `isNaN(n)`, которая преобразует аргумент к числу и возвращает `true`, если получилось `NaN`, и `false` -- для любого другого значения.
105
105
106
106
```js
107
107
//+ run
108
108
var n =0/0;
109
109
110
110
alert( isNaN(n) ); // true
111
+
alert( isNaN("12") ); // false, строка преобразовалась к обычному числу 12
111
112
```
112
113
113
-
[smart]
114
+
[smart header="Забавный способ проверки на `NaN`"]
114
115
Отсюда вытекает забавный способ проверки значения на `NaN`: можно проверить значение на равенство самому себе, если не равно -- то `NaN`:
115
116
116
117
```js
@@ -122,6 +123,7 @@ if (n !== n) alert( 'n = NaN!' );
122
123
123
124
Это работает, но для наглядности лучше использовать `isNaN(n)`.
124
125
[/smart]
126
+
125
127
</li>
126
128
<li>Значение `NaN` "прилипчиво". Любая операция с `NaN` возвращает `NaN`.
Copy file name to clipboardExpand all lines: 7-frames-and-windows/2-iframes/article.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,4 +1,4 @@
1
-
# Окно внутри ифрейма
1
+
# Общение между окнами и фреймами
2
2
3
3
Элемент `iframe` является обычным узлом DOM, как и любой другой. Существенное отличие -- в том, что с ним связан объект `window` внутреннего окна. Он доступен по ссылке `iframe.contentWindow`.
0 commit comments