В es6 вы можете использовать метод isArray() класса Array, чтобы определить, является ли переменная массивом. Этот метод используется для определения того, является ли объект типом массива. Синтаксис: «Array.isArray(obj)»; массив, он возвращает true, в противном случае возвращает false.
Операционная среда этого руководства: система Windows 7, ECMAScript версии 6, компьютер Dell G3.
Определение того, является ли переменная массивом в ES5
. В ES5 у нас есть как минимум следующие 5 способов определить, является ли значение массивом:
var a = []; // 1. На основе экземпляра экземпляр массива; // 2. На основе конструктора a.constructor === Массив; // 3. На основе Object.prototype.isPrototypeOf Array.prototype.isPrototypeOf(a); // 4. На основе getPrototypeOf Object.getPrototypeOf(a) === Array.prototype; // 5. На основе Object.prototype.toString Object.prototype.toString.apply(a) === '[object Array]';
Выше, за исключением Object.prototype.toString
, другие методы не могут правильно определить тип переменной.
Знаете, среда выполнения кода очень сложна, и переменная может использовать всевозможные ухищрения, чтобы запутать своего создателя. Давайте посмотрим
var a = { __proto__: Массив.прототип }; //Попробуйте запустить следующие коды в консоли соответственно // 1. На основе экземпляра экземпляр массива // => true; // 2. На основе конструктора a.constructor === Массив // => true; // 3. На основе Object.prototype.isPrototypeOf Array.prototype.isPrototypeOf(a); // => true // 4. На основе getPrototypeOf Object.getPrototypeOf(a) === Array.prototype; // => true
, все четыре метода вернут true Почему? Мы просто вручную указали атрибут __proto__ объекта как Array.prototype, что привело к тому, что объект унаследовал объект Array. Этот безответственный метод наследования привел к мгновенному разрушению схемы оценки, основанной на наследовании.
Мало того, мы также знаем, что массив представляет собой данные кучи, а переменная указывает только на свой ссылочный адрес, поэтому адрес, на который ссылается объект Array на каждой странице, различен. Для массива, объявленного в iframe, его конструктором является объект Array в iframe. Если массив x объявлен в iframe и присвоен переменной y родительской страницы, то на родительской странице используется экземпляр массива y, и результат должен быть ложным. Последний возвращает строку, поэтому проблем со ссылками нет. Фактически, взаимодействие между несколькими страницами или системами возможно только с помощью строк.
Определение того, является ли переменная массивом в ES6
. Ввиду общего использования массивов в ES6 добавлен метод Array.isArray. Использование этого метода для определения того, является ли переменная массивом, очень просто:
Array.isArray. ([]); // => правда Array.isArray({0: 'a', length: 1}); // => false
Фактически, использование Object.prototype.toString
для определения типа значения также является стандартом для основных основных библиотек. Поэтому полифилл для Array.isArray обычно выглядит так:
if (!Array.isArray){ Array.isArray = функция(аргумент){ return Object.prototype.toString.call(arg) === '[массив объектов]'; }; }