sort - ¿Cómo se implementan las matrices javascript?
javascript sort array by two properties (7)
A saber, cómo funciona el siguiente código:
var sup = new Array(5);
sup[0] = ''z3ero'';
sup[1] = ''o3ne'';
sup[4] = ''f3our'';
document.write(sup.length + "<br />");
salida ''5'' para la longitud, cuando todo lo que has hecho es establecer varios elementos?
Mi ''problema'' con este código es que no entiendo cómo cambia la length
sin llamar a un getLength()
o setLength()
. Cuando hago cualquiera de los siguientes:
a.length
a[''length'']
a.length = 4
a[''length''] = 5
en un objeto que no es de matriz, se comporta como una matriz dict / asociativa. Cuando hago esto en el objeto array, tiene un significado especial. ¿Qué mecanismo en JavaScript permite que esto suceda? ¿Tiene javascript algún tipo de sistema de propiedad que se traduce
a.length
a[''length'']
en métodos "get" y
a.length = 4
a[''length''] = 5
en métodos "establecidos"
Es importante saber que cuando haces sup[''look''] = 4;
no está utilizando una matriz asociativa, sino que modifica las propiedades en el objeto sup. Es equivalente a sup.look = 4;
ya que puede agregar dinámicamente propiedades en objetos javascript en cualquier momento. sup[''length'']
sería para una instancia de salida 5 en su primer ejemplo.
Para agregar a la respuesta de tvanfosson: en ECMA-262 (la especificación 3.0, creo), las matrices simplemente se definen como las que tienen este comportamiento para establecer propiedades (Ver 15.4.5.1). No hay un mecanismo general subyacente (al menos hasta ahora): así es como se define y cómo deben comportarse los intérpretes de JavaScript.
Si tiene la intención de implementar objetos con acceso tipo array, el artículo Array Mozilla dev center es un gran recurso. Lamentablemente, no conozco los detalles detallados de la implementación de Array, pero hay muchos detalles en ese artículo.
Array
objeto Array
hereda las propiedades del caller
, el constructor
, la length
y el name
de Function.prototype
.
Esto realmente depende de lo que pienses hacer con él.
[].length
es "mágico".
En realidad, no devuelve la cantidad de elementos en la matriz. Devuelve el mayor índice instalado en la matriz.
var testArr = []; testArr[5000] = "something"; testArr.length; // 5000
Pero el método detrás del setter está escondido en el motor mismo.
Algunos motores en algunos navegadores le darán acceso a sus implementaciones de esos métodos mágicos. Otros mantendrán todo completamente bloqueado.
Así que no confíe en los métodos defineGetter y defineSetter, o incluso, realmente, en los métodos de __proto__
, a menos que sepa a qué navegadores sabe que tiene como objetivo y cuáles no.
Esto cambiará en el futuro, donde las aplicaciones de aceptación escritas en ECMAScript Next / 6 tendrán acceso a más.
Los navegadores compatibles con ECMAScript 5 ya están comenzando a ofrecer métodos get
y set
magic en objetos, y aún queda mucho por delante ... ... pero es probable que pase un tiempo antes de que pueda descargar soporte para oldIE y una tonelada de teléfonos inteligentes, etcétera. ..
Todo en JavaScript es un objeto. En el caso de una Array
, la propiedad de length
devuelve el tamaño del área de almacenamiento interno para los elementos indexados de la matriz. Parte de la confusión puede entrar en juego en que el operador []
funciona tanto para argumentos numéricos como de cadena. Para una matriz, si la usa con un índice numérico, devuelve / establece el elemento indexado esperado. Si lo usa con una cadena, devuelve / establece la propiedad nombrada en el objeto de la matriz, a menos que la cadena corresponda a un valor numérico, luego devuelve el elemento indexado. Esto se debe a que en JavaScript los índices de matriz son forzados a cadenas por una llamada implícita toString()
. Francamente, esto es solo una más de esas cosas que te hacen rascarte la cabeza y decir "JavaScript, esto, es por eso que se ríen de ti".
La representación subyacente real puede diferir entre los navegadores (o puede que no). No confiaría en nada más que en la interfaz que se proporciona al trabajar con él.
Puede obtener más información sobre los arreglos de Javascript en MDN .
Una matriz de JavaScript es un objeto como cualquier otro objeto, pero JavaScript le da una sintaxis especial.
arr[5] = "yo"
Lo anterior es azúcar sintáctico para
arr.insert(5,"yo")
que es cómo agregarías cosas a un objeto regular. Es lo que hay dentro del método insert que cambia el valor de arr.length
Ver mi implementación de un tipo de Array personalizado aquí: http://jsfiddle.net/vfm3vkxy/4/