JavaScript: diferencia entre la matriz y el objeto tipo matriz
arrays (3)
¿Qué es?
Un objeto que tiene una propiedad de longitud de un entero no negativo, y generalmente algunas propiedades indexadas. Por ejemplo
var ao1 = {length: 0}, // like []
ao2 = {0: ''foo'', 5: ''bar'', length: 6}; // like ["foo", undefined × 4, "bar"]
Puede convertir
objetos tipo
matriz en
sus homólogos de
matriz
utilizando
Array.prototype.slice
var arr = Array.prototype.slice.call(ao1); // []
¿Cuál es la diferencia entre él y una matriz normal?
No está construido por
Array
o con un
Array literal
[]
, por lo que (generalmente) no heredará de
Array.prototype
.
La propiedad de
longitud
generalmente tampoco se actualizará automáticamente.
ao1 instanceof Array; // false
ao1[0] = ''foo'';
ao1.length; // 0, did not update automatically
¿Cuál es la diferencia entre un objeto tipo matriz y un objeto normal?
No hay diferencia. Incluso las matrices normales son objetos en JavaScript
ao1 instanceof Object; // true
[] instanceof Object; // true
Me he encontrado mucho con el término "Objeto similar a una matriz" en JavaScript. ¿Qué es? ¿Cuál es la diferencia entre él y una matriz normal? ¿Cuál es la diferencia entre un objeto tipo matriz y un objeto normal?
Creo que, en ES6, algo es como una matriz si es iterable (tiene una propiedad
[Symbol.iterator]
).
La famosa
HTMLCollection
(
documentation
) y los
arguments
(
documentation
) son objetos en forma de matriz que se crean automáticamente.
Algunas diferencias rápidas de tipo matriz (por ejemplo,
HTMLCollection
) entre ejemplos de matriz real:
var realArray = [''value1'', ''value2''];
var arrayLike = document.forms;
Similitudes:
El captador de longitud es el mismo:
arrayLike.length; // returns 2;
realArray.length; // returns 2; //there are 2 forms in the DOM.
El getter indexado es el mismo:
arrayLike[0]; // returns an element.
realArray[0]; // returns an element. (''value'')
Ambos son
objects
:
typeof arrayLike; // returns "object"
typeof realArray; // returns "object"
Diferencias:
En forma de matriz, los métodos
join()
,
concat()
join()
,
concat()
, etc., no son funciones:
arrayLike.join(", "); // returns Uncaught TypeError: arrayLike.join is not a function (also relevant to `concat()`, `includes()` etc.)
realArray.join(", "); // returns "value1, value2"
La matriz como no es realmente una matriz:
Array.isArray(arrayLike); //returns "false"
Array.isArray(realArray); //returns "true"
En una matriz como no puede establecer la propiedad de longitud:
arrayLike.length = 1;
arrayLike.length; //return 2; //there are 2 forms in the DOM.
realArray.length = 1;
realArray.length; //return 1;