Pregunta

Es decir, ¿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 />");

¿Resulta '5' para la longitud, cuando todo lo que ha hecho es configurar varios elementos?

Mi 'problema' con este código es que no entiendo cómo length cambios sin llamar a un getLength() o un setLength() método.Cuando hago cualquiera de las siguientes cosas:

a.length
a['length']
a.length = 4
a['length'] = 5

en un objeto que no es una matriz, se comporta como una matriz dict/asociativa.Cuando hago esto en el objeto de matriz, tiene un significado especial.¿Qué mecanismo en JavaScript permite que esto suceda?¿Javascript tiene algún tipo de sistema de propiedades que se traduce?

a.length
a['length']

en métodos "obtener" y

a.length = 4
a['length'] = 5

en métodos "establecidos"?

¿Fue útil?

Solución

Todo en JavaScript es un objeto. En el caso de un Array, la length propiedad devuelve el tamaño de la zona de almacenamiento interno para los artículos indexados de la matriz. Parte de la confusión pueden entrar en juego en el que el operador [] funciona para ambos argumentos numéricos y de cadena. Para una matriz, si lo usa con un índice numérico, devuelve / establece el elemento del índice esperado. Si lo usa con una cadena, devuelve / establece la propiedad nombrada en el objeto de matriz - a menos que la cadena corresponde a un valor numérico, entonces se devuelve el elemento indexado. Esto se debe a que en JavaScript índices de matriz son obligados a cadenas por un toString() llamada implícita. Francamente, esto es sólo una más de esas cosas que hace que usted se rasca la cabeza y dice "JavaScript, esto, es por esto que se ríen de ti."

La representación subyacente real puede diferir entre los navegadores (o puede que no). Yo no confiar en que no sea la interfaz que se suministra al trabajar con ella nada.

Puede encontrar más información acerca de las matrices de Javascript en MDN .

Otros consejos

Para añadir a la respuesta de tvanfosson: En ECMA-262 (la especificación 3.0, creo), las matrices se define simplemente como teniendo este comportamiento para establecer las propiedades (Ver 15.4.5.1). No existe un mecanismo general que subyace en ella (al menos por ahora) -. Esto es sólo cómo se define, y como intérpretes JavaScript debe comportarse

Esto realmente depende de lo que pretendas hacer con él.

[].length es "mágico".
En realidad, no devuelve la cantidad de elementos de la matriz.Devuelve el índice instalado más grande de la matriz.

var testArr = [];  testArr[5000] = "something";  testArr.length; // 5000

Pero el método detrás del colocador está oculto en el propio motor.
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, ni siquiera, en realidad, __proto__ métodos, a menos que sepa a qué navegadores está apuntando y cuáles no.

Esto cambiará en el futuro, donde las aplicaciones opt-in escritas en ECMAScript Next/6 tendrán acceso a más.

Los navegadores compatibles con ECMAScript 5 ya están empezando a ofrecer get y set métodos mágicos en objetos y hay más por venir......pero probablemente falta un tiempo antes de que puedas deshacerte del soporte para el antiguo IE y una tonelada de teléfonos inteligentes, etcétera...

Es importante saber que cuando se hace sup['look'] = 4; no está utilizando una matriz asociativa, sino más bien modificar las propiedades del objeto sup. Es equivalente a sup.look = 4; ya que se puede añadir dinámicamente las propiedades de los objetos JavaScript en cualquier momento. sup['length'] se tratara de una salida ejemplo 5 en el primer ejemplo.

Si está con la intención de implementar objetos con acceso a una matriz similar, el Mozilla gama artículo del centro dev es un gran recurso. Por desgracia, no sé la profundidad en los detalles de la implementación de matriz, pero hay una gran cantidad de datos en dicho artículo.

Array object inherits caller, constructor, length, and name properties from Function.prototype.

A JavaScript array is an object just like any other object, but JavaScript gives it special syntax.

arr[5] = "yo"

The above is syntactic sugar for

arr.insert(5,"yo")

which is how you would add stuff to a regular object. It's what is inside the insert method that changes the value of arr.length

See my implementation of a customArray type here: http://jsfiddle.net/vfm3vkxy/4/

As other people have mentioned, a property in JavaScript can basically act as both as getter and a setter of your array (or string or other inputs).

As a matter of fact, you might try this yourself:

const test=[1,2,3,4,5]
test.length = 3
console.log(test) // [1,2,3]
test.length = 5
console.log(test) // guess what happens here!

As far as I know, arrays in JS do not work exactly like associative arrays and you have elements which are put in memory as contiguously as possible (given that you can have arrays of mixed objects), depending on the JS engine you are considering.

As a side note, I am a bit baffled that the most voted answer keeps spreading the over-simplified myth (or half-truth) of "everything being an object in JavaScript"; that is not exactly true, otherwise you will never study primitives, for example.

Try to do this:

const pippi = "pippi"
pippi.cat = "cat"
console.log(pippi.cat) // will it work? Throw an error? Guess why again

Spoiler: the string is wrapped in a throwaway object for that specific operation on the second line, then in the following one you are just going to access a property of the primitive which is not there (provided you did not play with String.prototype or the like), so you get undefined.

Characteristics of a Javascript Array

  1. Dynamic - Arrays in Javascript can grow dynamically .push
  2. Can be sparse - For e.g. array[50000] = 2;
  3. Can be dense - For e.g. array =[1, 2, 3, 4, 5]

In Javascript, it is hard for the runtime to know whether the array is going to be dense or sparse. So all it can do is take a guess. All implementations use a heuristic to determine if the array is dense or sparse. For example, code in point 2 above, can indicate to javascript runtime that this is likely a sparse array implementation. If the array is initialised with an initial count, this could indicate that this is likely a dense array.

When the runtime detects that the array is Sparse, it is implemented in a similar way to an object. So instead of maintaining a contiguous array, a key/value map is built.

For more Reference - https://www.quora.com/How-are-javascript-arrays-implemented-internally

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top