En es6, puede usar el método isArray () de Array para determinar si una variable es una matriz. Este método se usa para determinar si un objeto es un tipo de matriz. La sintaxis es "Array.isArray (obj)"; una matriz, devuelve verdadero; de lo contrario, devuelve falso.
El entorno operativo de este tutorial: sistema Windows 7, ECMAScript versión 6, computadora Dell G3.
Determinar si una variable es una matriz en ES5 En ES5
, tenemos al menos las siguientes 5 formas de determinar si un valor es una matriz:
var a = []; // 1. Basado en instancia de una instancia de Array; // 2. Basado en el constructor a.constructor === Matriz; // 3. Basado en Object.prototype.isPrototypeOf Array.prototype.isPrototypeOf(a); // 4. Basado en getPrototypeOf Object.getPrototypeOf(a) === Array.prototype; // 5. Basado en Object.prototype.toString Object.prototype.toString.apply(a) === '[object Array]';
Arriba, excepto Object.prototype.toString
, otros métodos no pueden determinar correctamente el tipo de variable.
Ya sabes, el entorno de ejecución del código es muy complejo y una variable puede utilizar todo tipo de trucos para confundir a su creador. Veamos
var a = { __proto__: matriz.prototipo }; //Intenta ejecutar los siguientes códigos en la consola respectivamente // 1. Basado en instancia de una instancia de Array; // => verdadero // 2. Basado en el constructor a.constructor === Matriz; // => verdadero // 3. Basado en Object.prototype.isPrototypeOf Array.prototype.isPrototypeOf(a); // => verdadero // 4. Basado en getPrototypeOf Object.getPrototypeOf(a) === Array.prototype; // => verdadero
arriba, los cuatro métodos devolverán verdadero ¿Por qué? Simplemente especificamos manualmente el atributo __proto__ de un objeto como Array.prototype, lo que provocó que el objeto heredara el objeto Array. Este método de herencia irresponsable provocó que el esquema de juicio basado en la herencia colapsara instantáneamente.
No solo eso, también sabemos que Array son datos del montón y que la variable solo apunta a su dirección de referencia, por lo que la dirección a la que hace referencia el objeto Array de cada página es diferente. Para una matriz declarada en un iframe, su constructor es el objeto Array en el iframe. Si se declara una matriz x en el iframe y se asigna a la variable y de la página principal, entonces se usa y instancia de Array en la página principal y el resultado debe ser falso. El último devuelve una cadena, por lo que no hay problema de referencia. De hecho, las interacciones entre varias páginas o sistemas sólo son posibles con cadenas.
Determinar si una variable es una matriz en ES6
En vista del uso común de matrices, se agrega el método Array.isArray en ES6. Usar este método para determinar si una variable es una matriz es muy simple, de la siguiente manera:
Array.isArray. ([]); // => verdadero Array.isArray({0: 'a', length: 1}); // => false
De hecho, usar Object.prototype.toString
para determinar el tipo de un valor también es un estándar para las principales bibliotecas. Por lo tanto, el polyfill para Array.isArray normalmente se ve así:
if (!Array.isArray){ Array.isArray = función(arg){ return Object.prototype.toString.call(arg) === '[matriz de objetos]'; }; }