Je savais depuis longtemps que les arguments pouvaient être convertis en tableau : [].slice.call(arguments), car
arguments est un objet de type tableau, il peut donc être utilisé comme ceci. Mais je n'ai jamais été clair sur le nom des objets de type tableau
Quand j'ai lu Effective JavaScript aujourd'hui, il y avait une section dédiée à cela, et c'était vraiment cool.
Regardez d'abord un exemple de code que j'ai écrit :
a = "bonjour"
[].map.call(a, (e) -> e.toUpperCase()) # =>
[].reduceRight.call(a, (acc, e) -> acc e) # =>
b = {1 : "a", 2 : "b", 4 : "c", longueur : 6}
[].reduce.call(b, (acc, e) -> acc e) # =>
Les premiers fonctionnent sur des chaînes. Eh bien, les chaînes peuvent également être considérées comme des objets de type tableau. Mais l'objet b à l'arrière est en fait
C'est aussi un objet de type tableau.
Lisez l'explication dans le livre :
Copier le code
Le code est le suivant :
Alors, qu'est-ce qui fait exactement qu'un objet « ressemble à un tableau » ? Le contrat de base de
un objet tableau se résume à deux règles simples.
Il a une propriété de longueur entière comprise entre 0...2^32 – 1.
La propriété length est supérieure au plus grand index de l'objet.
Un index est un entier compris entre 0...2^32 – 2 dont la représentation sous forme de chaîne
est la clé d'une propriété de l'objet.
Il n’y a que ces deux règles simples.
Alors pourquoi les arguments, les chaînes et l'objet b ci-dessus peuvent-ils être considérés comme des objets de type tableau ?
Ils ont tous un attribut de longueur légale (un entier positif compris entre 0 et 2**32 - 1).
Les valeurs de l'attribut length sont supérieures à leur indice maximum.
Autre exemple :
[].reduce.call(b, (acc, e) -> acc e) # =>
Eh bien, c'est faux, c'est devenu « ab », car cela viole la règle 2 : l'attribut length est 3,
La valeur d'index maximale est 4, ce qui est supérieur à la propriété length. Le comportement est donc anormal.
C'est trop puissant. Il semble que cela définisse simplement une interface. Tant qu'il est conforme à cette interface, vous pouvez utiliser toutes les méthodes du tableau.
En fait, toutes les méthodes ne peuvent pas être utilisées, Array.prototype.concat
Il ne peut pas être utilisé car il connecte deux tableaux. Si vous n'êtes pas un amateur de tableaux, vous ne pourrez certainement pas l'utiliser.
Un autre petit problème est que la chaîne est immuable après sa création, elle restera donc immuable quelle que soit la façon dont vous la lancez.
Mais ce livre n'explique pas du tout pourquoi il peut être considéré comme un objet de type tableau s'il remplit ces deux conditions. De plus, l'auteur de ce livre
.
Il est membre du comité ECMAScript, donc c'est fondamentalement crédible. Quant à savoir pourquoi il peut être considéré comme un objet de type tableau s'il remplit ces deux conditions, je ne sais pas, j'ai longtemps cherché sur Google et je n'ai trouvé aucune explication raisonnable.
Ce qui précède représente l’intégralité du contenu de cet article, j’espère que vous l’aimerez tous.