JavaScript типи, класи та кадри, Блог ГО

Розглянемо ще один аспект: кадри. З кадру у кадр можна передавати дані.

Наприклад, у нас є функція, яка обробляє масив трохи інакше, ніж об'єкт:

І на сторінці є iframe, в якому наступне:

window.parent.func([1, 2, 3]);

Це працюватиме некоректно. Оскільки ми порівнюємо значення з нашим Array з нашого основного вікна. А значення створено у кадрі, в якому свій window і свій window.Array і саме від нього виробляється цей масив.

Спробуємо тепер визначити тип і клас значення з урахуванням того, що воно може прийти не з нашого вікна.

Як визначити, що значення надійшло з кадру

Усі нескалярні значення успадковуються від Object , отже їм можна перевірити так:

value instanceof Object; // value успадковується від Object нашого вікна, отже воно з нього.

typeof і порівняння зі значенням

typeof працює, як завжди, і для «не наших» значень:

typeof null, як і раніше «object», але його краще визначати порівнянням:

function isNull(value) < return value === null; >function isUndefined(value)

В найближчому майбутньому ми, сподіваюся, нарешті, зможемо за допомогою типувизначити і функцію, але поки що тут є нюанси:

typeof alert === "object"; // Host-функції в IE array, regexp, Error, Date і String, Number і Boolean створені через конструктори (new Number(1)):

Для масиву ще можна згадати, що у нас вже майже повсюдно ES5:

DOM для звичайних браузерів

Для нормальних браузерів нам залишилося визначити HTMLCollection та DOM-елементи.

Усі DOM-елементи мають рядкову виставу виду «[object HTML Element]»:

element instanceof window.HTMLElement;

У Firefox цеспрацьовує для DOM-елементів завжди, незалежно від яких кадрів цей елемент або HTMLElement . При тому, що element instanceof Object працює лише одного кадру.

В інших браузерах це спрацьовує тільки для свого кадру, а в IE HTMLElement взагалі немає (зате в IE8 є Element).