Heim  >  Artikel  >  Web-Frontend  >  Array-ähnliche Objekte in JavaScript_Javascript-Kenntnissen

Array-ähnliche Objekte in JavaScript_Javascript-Kenntnissen

WBOY
WBOYOriginal
2016-05-16 16:05:201136Durchsuche

Ich wusste schon vor langer Zeit, dass Argumente in ein Array umgewandelt werden können: [].slice.call(arguments), weil
arguments ist ein Array-ähnliches Objekt und kann daher wie folgt verwendet werden. Aber mir war nie klar, wie arrayartige Objekte

heißen

Als ich heute „Effective JavaScript“ gelesen habe, gab es einen eigenen Abschnitt, der diesem Thema gewidmet war, und es fühlte sich wirklich cool an.

Sehen Sie sich zunächst einen Beispielcode an, den ich geschrieben habe:

Code kopieren Der Code lautet wie folgt:

a = „Hallo“
[].map.call(a, (e) -> e.toUpperCase()) # => [].reduceRight.call(a, (acc, e) -> acc e) # => b = {1: „a“, 2: „b“, 4: „c“, Länge: 6}
[].reduce.call(b, (acc, e) -> acc e) # => 'abc'


Die ersten arbeiten mit Strings. Nun, Strings können auch als Array-ähnliche Objekte betrachtet werden. Aber das B-Objekt hinten ist tatsächlich Es ist auch ein Array-ähnliches Objekt.


Lesen Sie die Erklärung im Buch:

Was genau macht ein Objekt „arrayartig“? Der Grundvertrag von
Ein Array-Objekt läuft auf zwei einfache Regeln hinaus.
Es hat eine ganzzahlige Längeneigenschaft im Bereich 0...2^32 – 1.
Die Längeneigenschaft ist größer als der größte Index des Objekts.
Ein Index ist eine Ganzzahl im Bereich 0...2^32 – 2, deren String-Darstellung
ist der Schlüssel einer Eigenschaft des Objekts.


Es gibt nur diese beiden einfachen Regeln.

Warum können Argumente, Zeichenfolgen und das obige B-Objekt als Array-ähnliche Objekte betrachtet werden?

Sie haben alle ein zulässiges Längenattribut (eine positive ganze Zahl zwischen 0 und 2**32 - 1).

Werte des Längenattributs sind größer als ihr maximaler Index.

Ein weiteres Beispiel:

b = {1: „a“, 2: „b“, 4: „c“, Länge: 3}
[].reduce.call(b, (acc, e) -> acc e) # => 'ab'


Nun, das ist falsch, es wurde zu „ab“, weil es gegen Regel 2 verstößt: Das Längenattribut ist 3, Der maximale Indexwert beträgt 4 und ist damit größer als die Längeneigenschaft. Das Verhalten ist also abnormal.


Es scheint, dass es nur eine Schnittstelle definiert. Solange es dieser Schnittstelle entspricht, können Sie alle Methoden des Arrays verwenden.

Tatsächlich können nicht alle Methoden verwendet werden, Array.prototype.concat

Es kann nicht verwendet werden, da es zwei Arrays verbindet. Wenn Sie kein Array-Benutzer sind, können Sie es definitiv nicht verwenden.


Ein weiteres kleines Problem besteht darin, dass die Zeichenfolge nach ihrer Erstellung unveränderlich ist, sodass sie unveränderlich bleibt, egal wie Sie sie werfen.

Aber dieses Buch erklärt überhaupt nicht, warum es als Array-ähnliches Objekt betrachtet werden kann, wenn es diese beiden Bedingungen erfüllt. Darüber hinaus ist der Autor dieses Buches

Er ist Mitglied des ECMAScript-Komitees und daher grundsätzlich glaubwürdig. Warum es als Array-ähnliches Objekt betrachtet werden kann, wenn es diese beiden Bedingungen erfüllt, weiß ich nicht. Ich habe lange bei Google gesucht und keine vernünftige Erklärung gefunden.


Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er gefällt Ihnen allen.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn