Question

A savoir, comment le code suivant:

var sup = new Array(5);
sup[0] = 'z3ero';
sup[1] = 'o3ne';
sup[4] = 'f3our';
document.write(sup.length + "<br />");

output « 5 » pour la longueur, quand tout ce que vous avez fait est défini divers éléments?

Mon « problème » avec ce code est que je ne comprends pas comment les changements sans appeler length un ou une méthode getLength() setLength(). Quand je fais une des opérations suivantes:

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

sur un objet non-tableau, il se comporte comme un tableau dict / associatif. Quand je fais l'objet de tableau, il a une signification particulière. Quel est le mécanisme en JavaScript permet que cela se produise? Est-ce que le javascript a un certain type de système de propriété qui se traduit

a.length
a['length']

dans les méthodes "get" et

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

dans "set" méthodes?

Était-ce utile?

La solution

Tout en JavaScript est un objet. Dans le cas d'un Array, la length propriété renvoie la taille de la zone de stockage interne pour les éléments indexés de la matrice. Une partie de la confusion peut entrer en jeu en ce que l'opérateur travaille pour les deux [] arguments numériques et de chaîne. Pour un tableau, si vous l'utilisez avec un index numérique, il retourne / définit l'élément indexé prévu. Si vous l'utilisez avec une chaîne, elle retourne / définit la propriété nommée sur l'objet de tableau - sauf si la chaîne correspond à une valeur numérique, il renvoie l'élément indexé. En effet, dans JavaScript indexes sont contraints à des chaînes par un appel implicite toString(). Franchement, cela est juste une de ces choses qui vous fait gratter la tête et de dire « JavaScript, ce, c'est pourquoi ils se moquent de vous. »

La représentation sous-jacente réelle peut différer entre les navigateurs (ou il ne peut pas). Je ne pas compter sur autre chose que l'interface qui est fournie lorsque vous travaillerez avec.

Vous pouvez en savoir plus sur les tableaux Javascript MDN .

Autres conseils

Pour ajouter à la réponse de tvanfosson: Dans ECMA-262 (la spécification 3.0, je crois), les tableaux sont simplement définis comme ayant ce comportement pour la définition des propriétés (Voir 15.4.5.1). Il n'y a pas de mécanisme général qui sous-tend (au moins à partir de maintenant) -. C'est à quel point il est défini, et comment les interprètes javascript doit se comporter

Cela dépend vraiment de ce que vous avez l'intention de le faire avec.

[].length est "magique".
Il ne retourne pas vraiment le nombre d'éléments dans le tableau. Il retourne le plus grand indice instated dans le tableau.

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

Mais la méthode derrière le poseur est caché dans le moteur lui-même.
Certains moteurs dans certains navigateurs vous donnera accès à leur mise en œuvre de ces méthodes magiques-. D'autres tout garder complètement verrouillé.

Alors, ne comptez pas sur defineGetter et méthodes defineSetter, ou même, vraiment, méthodes __proto__, sauf si vous savez quels navigateurs vous savez que vous ciblez, et que vous n'êtes pas.

Cela va changer à l'avenir, où les applications opt-in écrit dans ECMAScript Next / 6 auront accès à plus.

ECMAScript 5 navigateurs compatibles commencent déjà à offrir et get méthodes magiques dans set objets et il y a plus à venir ... ... mais il est sans doute un certain temps avant vous pouvez jeter un soutien pour Oldie et tonne de téléphones intelligents, et ainsi de suite ...

Il est important de savoir que lorsque vous faites vous ne sup['look'] = 4; utilisez un tableau associatif, mais plutôt de modifier les propriétés sur le sup objet. Il est équivalent à puisque vous pouvez sup.look = 4; dynamiquement ajouter des propriétés sur les objets javascript à tout moment. Utiliseriez pour une sup['length'] sortie par exemple 5 dans votre premier exemple.

Si vous avez l'intention de mettre en œuvre des objets avec un accès semblable à un tableau, tableau Mozilla article centre dev est une grande ressource. Malheureusement, je ne sais pas dans les détails de la profondeur de la mise en œuvre Array, mais il y a beaucoup de détails dans cet article.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top