1. typeof

Сначала мы могли бы подумать об использовании typeof для определения типа данных, но для базовых типов, таких как Function, String, Number, Undefined и т. д., typeof может определить их все. Например, код выглядит следующим образом:

function test(){} console.log(typeof 1); // number console.log(typeof test); // function console.log(typeof "yunxi"); // string console.log(typeof undefined); // undefined

Но для массивов или регулярных выражений использования typeof для их определения будет недостаточно, потому что когда мы определяем массив или регулярное выражение, возвращаемый тип будет объектом. Как показано в следующем коде:

console.log(typeof []); // object console.log(typeof /\d+/g); // object

2. Instanceof

Отсюда легко догадаться использовать instanceof для проверки, является ли объект экземпляром массива. Эта проверка возвращает логическое значение. Если это массив, она возвращает true; в противном случае — false. Давайте посмотрим на код выше, чтобы проверить, является ли он массивом:

console.log([] instanceof Array); // true console.log(/\d+/g instanceof Array); // false

Как видно выше, использование instanceof действительно позволяет определить, является ли он массивом.

3. Свойство constructor

В JavaScript у каждого объекта есть свойство constructor, которое ссылается на функцию-конструктор, инициализировавшую объект. Например, чтобы определить тип неизвестного объекта, мы можем написать метод следующим образом:

function isArray(obj) { return typeof obj == 'object' && obj.constructor == Array } //Тестовое демо console.log(isArray([])); // true var a = {"a":1}; console.log(isArray(a)); // false var b = [1,2,3]; console.log(isArray(b)); // true console.log(isArray(/\d+/g));// false

Как видно выше, вызывая метод isArray, мы также можем определить, является ли это массивом.

Теперь мы можем видеть, что для пунктов 2 и 3 использование метода instanceof и свойства constructor соответственно, по-видимому, позволяет определить, является ли это массивом. Однако есть исключения. Например, при использовании массива со страницы из другого фрейма (iframe) это не сработает, потому что в разных фреймах (iframe) созданные массивы не разделяют между собой свойство prototype. Следующий тест с кодом может это проверить~

var iframe = document.createElement('iframe'); document.body.appendChild(iframe); xArray = window.frames[window.frames.length-1].Array; var arr = new xArray("1","2","3","4","5"); //Этот синтаксис не поддерживается в IE; он доступен в стандартных браузерах, таких как Firefox и Chrome. console.log(arr); //Выводит ["1", "2", "3", "4", "5"] console.log(arr instanceof Array); // false console.log(arr.constructor === Array); // false

Ни один из вышеперечисленных методов не может определить, является ли объект массивом; однако, если обратиться к ECMA262, можно увидеть, что метод Object.prototype.toString.call() может использоваться для определения того, является ли объект массивом. Код выглядит следующим образом:

function isArray(obj) { return Object.prototype.toString.call(obj) == '[object Array]'; } //Вызов кода console.log(isArray([])); // true console.log(isArray([1,2,3])); // true var iframe = document.createElement('iframe'); document.body.appendChild(iframe); xArray = window.frames[window.frames.length-1].Array; var arr = new xArray("1","2","3","4","5"); console.log(arr); // ["1","2","3","4","5"] console.log(isArray(arr)); // true