Это 22-й день моего участия в августовском испытании обновлений.Подробности о событии:Испытание августовского обновления
предисловие
В нашей повседневной разработке нам часто приходится оценивать определенный тип значения.Сегодня мы суммируем несколько распространенных методов JavaScript для определения того, является ли это массивом.
Array.isArray
Array.isarray () - это новый метод ES5, который определяет, является ли пропущенное значение массивом, и возвращает True, если это массив, и False в противном случае.
let arr = [];
console.log(Array.isArray(arr)); // true
Следующая функция вызывает all return true:
Array.isArray([]);
Array.isArray([1]);
Array.isArray(new Array());
Array.isArray(new Array("a", "b", "c", "d"));
Одно замечание: на самом деле Array.prototype также является массивом.
Array.isArray(Array.prototype); // true
Следующая функция вызывает all return false:
Array.isArray();
Array.isArray({});
Array.isArray(null);
Array.isArray(undefined);
Array.isArray(17);
Array.isArray('Array');
Array.isArray(true);
Array.isArray(false);
Array.isArray(new Uint8Array(32))
Array.isArray({ __proto__: Array.prototype });
Совместимость следующая:
Видно, что все новые версии основных браузеров поддерживают этот метод, вы можете уверенно им пользоваться.
constructor
Каждый экземпляр Object имеет конструктор конструктора, который содержит функцию, используемую для создания текущего объекта.
let arr = [];
console.log(arr.constructor === Array); // true
Следует отметить, что конструктор может быть изменен, и результат оценки может быть неточным, например:
let arr = [1, 2, 3];
arr.constructor = function () { }
console.log(arr.constructor === Array); // false
Вообще не рекомендуется использовать конструктор для определения массива, нам просто нужно знать, что такой метод есть в строке.
instanceof
Оператор instanceof используется для определения того, присутствует ли свойство прототипа конструктора в цепочке прототипов экземпляра объекта. Например:
// 定义构造函数
function C() {}
function D() {}
var o = new C();
o instanceof C; // true,因为 Object.getPrototypeOf(o) === C.prototype
o instanceof D; // false,因为 D.prototype 不在 o 的原型链上
o instanceof Object; // true,因为 Object.prototype.isPrototypeOf(o) 返回 true
C.prototype instanceof Object; // true,同上
Использование instanceof для определения того, является ли это массивом, выглядит следующим образом:
let arr = [];
console.log(arr instanceof Array); // true
При использовании instanceof следует учитывать две вещи:
- Прототип конструктора и цепочка прототипов экземпляра могут меняться, поэтому результат суждения не обязательно будет одним и тем же.
- Использование instanceof в скрипте страницы с iframe может дать неправильные результаты, поскольку iframe имеют отдельные глобальные среды, а разные глобальные среды имеют разные глобальные объекты и, следовательно, разные встроенные конструкторы типов.
isPrototypeOf
isPrototypeOf()
Может использоваться для проверки существования объекта в цепочке прототипов другого объекта. Использование заключается в следующем:
function Foo() {}
function Bar() {}
function Baz() {}
Bar.prototype = Object.create(Foo.prototype);
Baz.prototype = Object.create(Bar.prototype);
var baz = new Baz();
console.log(Baz.prototype.isPrototypeOf(baz)); // true
console.log(Bar.prototype.isPrototypeOf(baz)); // true
console.log(Foo.prototype.isPrototypeOf(baz)); // true
console.log(Object.prototype.isPrototypeOf(baz)); // true
Если вы хотите, чтобы isPrototypeOf определял, является ли входящий параметр массивом, вы можете использовать это:
let arr = [];
console.log(Array.prototype.isPrototypeOf(arr)); // true
Object.prototype.toString
Каждый объект имеетtoString()
метод, вызываемый автоматически, когда объект представлен как буквальное значение или когда на объект ссылаются ожидаемым строковым способом.
по умолчанию,toString()
метод каждогоObjectНаследование объекта. Если этот метод не переопределен в пользовательском объекте,toString()
вернуть "[object type]" строка, где тип - это тип объекта.
в состоянии пройтиtoString()
чтобы получить тип каждого объекта. Чтобы каждый объект мог быть обнаружен Object.prototype.toString(), он должен начинаться сFunction.prototype.call()
илиFunction.prototype.apply()
, передавая проверяемый объект в качестве первого параметра с именем thisArg. Использование заключается в следующем:
var toString = Object.prototype.toString;
toString.call(new Date); // [object Date]
toString.call(new String); // [object String]
toString.call(Math); // [object Math]
//Since JavaScript 1.8.5
toString.call(undefined); // [object Undefined]
toString.call(null); // [object Null]
Если вы хотите использовать его, чтобы определить, является ли объект массивом, вы можете использовать его следующим образом:
let arr = [];
console.log(Object.prototype.toString.call(arr) === "[object Array]"); // true
Совместимость следующая:
typeof
Когда дело доходит до оценки типов, многие люди могут подумать о методе typeof.Давайте рассмотрим содержание typeof здесь.
Оператор typeof возвращает строку, представляющую тип невычисленного операнда.
console.log(typeof 42); // "number"
console.log(typeof 'blubber'); // "string"
console.log(typeof true); // "boolean"
console.log(typeof undeclaredVariable); // "undefined"
Возможные возвращаемые значения typeof следующие:
Как видно из приведенного выше рисунка, объект массива принадлежит «любому другому объекту», поэтому возвращаемое значение typeof объекта массива — «объект»:
let arr = [];
console.log(typeof arr); // "object"
Поэтому мы должны стараться избегать использования typeof.
Суммировать
Выше приведены несколько методов, используемых для определения того, является ли значение массивом.Конечно, некоторые из них полезны, а некоторые нет, но в любом случае мы знаем, что всегда хорошо иметь такую вещь. В заключение:
- Лучший способ использовать это
Array.isArray
IE8 и ниже. - Если вы хотите рассмотреть совместимость, вы можете использовать
Object.prototype.toString
.
~
~ Конец этой статьи, спасибо за чтение!
~
Получайте интересные знания, встречайте интересных друзей и формируйте интересные души!
Привет всем, я〖Программирование самадхи〗авторКороль-затворник, мой официальный аккаунт "Программирование самадхи』, пожалуйста, обратите внимание, я надеюсь, что вы можете дать мне больше советов!
Вы приходите, с ожиданиями, у меня есть аромат чернил, чтобы приветствовать вас! Вы возвращаетесь, что бы вы ни приобрели или ни потеряли, вы можете отдать это только с осадком!
Подчеркиваются как знания, так и навыки, культивируются внутренние и внешние навыки, должны быть усвоены как теория, так и практика, и обе руки должны быть твердыми!