No es6, você pode usar o método isArray() do Array para determinar se uma variável é um array. Este método é usado para determinar se um objeto é um tipo de array. um array, ele retorna verdadeiro, caso contrário, retorna falso.
O ambiente operacional deste tutorial: sistema Windows 7, ECMAScript versão 6, computador Dell G3.
Determinando se uma variável é um array no ES5 No ES5
, temos pelo menos as 5 maneiras a seguir para determinar se um valor é um array:
var a = []; // 1. Baseado em instância uma instância de Array; // 2. Baseado no construtor a.construtor === Matriz; // 3. Baseado em Object.prototype.isPrototypeOf Array.prototype.isPrototypeOf(a); // 4. Baseado em getPrototypeOf Object.getPrototypeOf(a) === Array.prototype; // 5. Baseado em Object.prototype.toString Object.prototype.toString.apply(a) === '[object Array]';
Acima, exceto Object.prototype.toString
, outros métodos não podem determinar corretamente o tipo da variável.
Você sabe, o ambiente de execução do código é muito complexo e uma variável pode usar todos os tipos de truques para confundir seu criador. Vamos ver
var a = { __proto__: Array.prototype }; //Tente executar os seguintes códigos no console respectivamente // 1. Baseado em instanceof uma instância de Array; // => true // 2. Baseado no construtor a.construtor === Matriz; // => verdadeiro // 3. Baseado em Object.prototype.isPrototypeOf Array.prototype.isPrototypeOf(a); // => verdadeiro // 4. Baseado em getPrototypeOf Object.getPrototypeOf(a) === Array.prototype; // => true
acima, todos os quatro métodos retornarão true. Acabamos de especificar manualmente o atributo __proto__ de um objeto como Array.prototype, o que fez com que o objeto herdasse o objeto Array. Esse método de herança irresponsável fez com que o esquema de julgamento baseado na herança entrasse em colapso instantaneamente.
Além disso, também sabemos que Array são dados heap, e a variável aponta apenas para seu endereço de referência, portanto o endereço referenciado pelo objeto Array de cada página é diferente. Para um array declarado em um iframe, seu construtor é o objeto Array no iframe. Se um array x for declarado no iframe e atribuído à variável y da página pai, então y instanceof Array será usado na página pai e o resultado deverá ser falso. O último retorna uma string, portanto não há problema de referência. Na verdade, as interações entre múltiplas páginas ou sistemas só são possíveis com strings.
Determinando se uma variável é um array no ES6
Tendo em vista o uso comum de arrays, o método Array.isArray é adicionado no ES6. Usar este método para determinar se uma variável é um array é muito simples, como segue:
Array.isArray. ([]); // => verdadeiro Array.isArray({0: 'a', length: 1}); // => false
Na verdade, usar Object.prototype.toString
para determinar o tipo de um valor também é um padrão para as principais bibliotecas convencionais. Portanto, o polyfill para Array.isArray geralmente se parece com isto:
if (!Array.isArray){ Array.isArray = função(arg){ return Object.prototype.toString.call(arg) === '[array de objetos]'; }; }