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).