string.charAt (x) oder string [x]?

246

Gibt es einen Grund, den ich string.charAt(x)anstelle der Klammernotation verwenden sollte string[x]?

Mixer
quelle
3
Achtung : Wenn Sie entweder die Syntax für Emojis oder andere Unicode-Zeichen nach dem BPM für die mehrsprachige Basisebene (AKA, die "Astralebene" ) verwenden, "😃".charAt(0)wird ein unbrauchbares Zeichen zurückgegeben
KyleMit

Antworten:

243

Die Klammernotation funktioniert jetzt in allen gängigen Browsern mit Ausnahme von IE7 und darunter.

// Bracket Notation
"Test String1"[6]

// charAt Implementation
"Test String1".charAt(6)

Aus folgenden Gründen war es eine schlechte Idee, Klammern zu verwenden ( Quelle ):

Diese Notation funktioniert in IE7 nicht. Das erste Code-Snippet wird in IE7 undefiniert zurückgegeben. Wenn Sie die Klammernotation für Zeichenfolgen im gesamten Code verwenden und zu der Sie migrieren möchten .charAt(pos), ist dies ein echtes Problem: Klammern werden im gesamten Code verwendet, und es gibt keine einfache Möglichkeit, festzustellen, ob dies für eine Zeichenfolge oder ein Array gilt. Objekt.

Sie können das Zeichen nicht mit dieser Notation festlegen. Da es keinerlei Warnung gibt, ist dies wirklich verwirrend und frustrierend. Wenn Sie die .charAt(pos)Funktion verwendet hätten, wären Sie nicht versucht gewesen, dies zu tun.

Brian Webster
quelle
21
Die Notation funktioniert zwar nicht in IE7, aber das ist heutzutage kein großer Nachteil. In der Zwischenzeit zeigten die von mir durchgeführten Benchmarks einen dreimaligen Leistungsabfall bei Verwendung von charAt vs indexer in Chrome, wenn die Zeichenfolge in einem Objekt eingeschlossen ist. Ich weiß, dass das nicht wirklich relevant ist, aber dennoch erwähnenswert. jsfiddle.net/mdasxxd2
Siderite Zackwehdex
5
Ein genauerer Test (Benchmark.js) esbench.com/bench/579609a0db965b9a00965b9e
NoNameProvided
3
Obwohl diese Antwort die höchste Punktzahl ist, ist sie jetzt (2019) deutlich veraltet. Stattdessen sollte auf die Antwort unter Angabe von MDN verwiesen werden.
Scott Martin
97

Von MDN :

Es gibt zwei Möglichkeiten, auf ein einzelnes Zeichen in einer Zeichenfolge zuzugreifen. Die erste ist die charAtMethode, die Teil von ECMAScript 3 ist:

return 'cat'.charAt(1); // returns "a"

Die andere Möglichkeit besteht darin, die Zeichenfolge als Array-ähnliches Objekt zu behandeln, wobei jedes einzelne Zeichen einem numerischen Index entspricht. Dies wird von den meisten Browsern seit ihrer ersten Version unterstützt, mit Ausnahme des IE. Es wurde in ECMAScript 5 standardisiert:

return 'cat'[1]; // returns "a"

Der zweite Weg erfordert die Unterstützung von ECMAScript 5 (und wird in einigen älteren Browsern nicht unterstützt).

In beiden Fällen funktioniert der Versuch, ein einzelnes Zeichen zu ändern, nicht, da Zeichenfolgen unveränderlich sind, dh ihre Eigenschaften weder "beschreibbar" noch "konfigurierbar" sind.

  • str.charAt(i) ist aus Kompatibilitätssicht besser, wenn IE6 / IE7-Kompatibilität erforderlich ist.
  • str[i] ist moderner und funktioniert in IE8 + und allen anderen Browsern (alle Edge / Firefox / Chrome, Safari 2+, alle iOS / Android).
Matt Ball
quelle
19
Richtig, ECMA 5 wird noch nicht von ALLEN Browsern unterstützt, aber es wird von den MEISTEN Browsern unterstützt: dh IE9 und höher und alle Chrome / Firefox-Versionen: kangax.github.io/compat-table/es5/#Property_access_on_strings Keine JS-Funktion wird jemals verfügbar sein 100% unterstützt werden, und ich bin der Meinung, dass die Vermeidung der Verwendung von ECMA 5-Funktionen uns für immer in der Vergangenheit belassen wird ...
Danny R
83

Sie können in Randfällen unterschiedliche Ergebnisse liefern.

'hello'[NaN] // undefined
'hello'.charAt(NaN) // 'h'

'hello'[true] //undefined
'hello'.charAt(true) // 'e'

Die Funktion charAt hängt davon ab, wie der Index in der Spezifikation in eine Zahl konvertiert wird .

MarkG
quelle
Auch 'hello'[undefined] // undefinedund'hello'.charAt(undefined) //h
Juan Mendes
3
nullfunktioniert wie undefined, aber sehen Sie dies: "hello"["00"] // undefinedaber "hello".charAt("00") // "h"und"hello"["0"] // "h"
Panzi
11
Dies überzeugt mich von ganzem Herzen, weiter zu verwenden [].
Annäherung
Dies bedeutet auch, dass .charAt()eine zusätzliche Konvertierung für seinen Parameter in a durchgeführt wird Number. Zu Ihrer Information, es gibt heutzutage fast keinen Leistungsunterschied mehr.
26онстантин Ван
7
Diese Antwort sollte nach oben gehen, sie erklärt tatsächlich, dass es einen Unterschied zwischen den beiden Methoden gibt. Die anderen Antworten sprechen von der Kompatibilität für IE7 (ich meine wirklich?), Während diese Antwort eine sehr reale Gefahr erklärt.
Sturm Müller
11

String.charAt () ist der ursprüngliche Standard und funktioniert in allen Browsern. In IE 8+ und anderen Browsern können Sie die Klammer-Notation verwenden, um auf Zeichen zuzugreifen, aber IE 7 und niedriger haben dies nicht unterstützt.

Wenn jemand wirklich die Klammer-Notation in IE 7 verwenden möchte, ist es ratsam, die Zeichenfolge mithilfe von in ein Array zu konvertieren str.split('')und sie dann als Array zu verwenden, das mit jedem Browser kompatibel ist.

var testString = "Hello"; 
var charArr = testString.split("");
charArr[1]; // "e"
CharithJ
quelle
5
IE unterstützt die Klammernotation ab 8.
mrec
3
Diese Methode bricht ab, wenn es um Unicode geht: mathiasbynens.be/notes/javascript-unicode
Jeremy J Starcher
Diese Methode wäre beim Umgang mit wirklich großen Zeichenfolgen ineffizient, da sie die Daten im Speicher (die ursprüngliche Zeichenfolge und das Array) duplizieren würde.
Daniel
8

Sehr interessantes Ergebnis, wenn Sie den String-Index-Accessor mit der charAt()Methode testen . Chrome scheint der einzige Browser zu sein, der charAtmehr mag .

CharAt vs Index 1

ChartAt vs Index 2

ChartAt vs Index 3

Arman McHitarian
quelle
1
Dies ist nicht mehr der Fall. indexist auch in Chrom viel schneller.
Mako-Taco
5

Es gibt einen Unterschied, wenn Sie versuchen, auf einen Index zuzugreifen, der außerhalb der Grenzen liegt oder keine Ganzzahl ist.

string[x]Gibt das Zeichen an der xth-Position in stringif zurück, wenn xes eine Ganzzahl zwischen 0 und ist string.length-1, und gibt undefinedandernfalls zurück.

string.charAt(x)umwandelt xin eine Ganzzahl unter Verwendung des Verfahrens erläutert hier (die rundet grundsätzlich xab , wenn xeine nicht ganzzahlige Zahl und liefert 0 , wenn ist , parseInt(x)ist NaN) , und dann das Zeichen an der diese Position zurückgibt , wenn die ganze Zahl zwischen 0 und ist string.length-1ansonsten, und gibt eine leere Zeichenfolge .

Hier sind einige Beispiele:

"Hello"[313]    //undefined
"Hello".charAt(313)    //"", 313 is out of bounds

"Hello"[3.14]    //undefined
"Hello".charAt(3.14)    //'l', rounds 3.14 down to 3

"Hello"[true]    //undefined
"Hello".charAt(true)    //'e', converts true to the integer 1

"Hello"["World"]    //undefined
"Hello".charAt("World")    //'H', "World" evaluates to NaN, which gets converted to 0

"Hello"[Infinity]    //undefined
"Hello".charAt(Infinity)    //"", Infinity is out of bounds

Ein weiterer Unterschied besteht darin, dass das Zuweisen zu string[x]nichts bewirkt (was verwirrend sein kann) und das Zuweisen zu string.charAt(x)(wie erwartet) ein Fehler ist:

var str = "Hello";
str[0] = 'Y';
console.log(str);    //Still "Hello", the above assignment did nothing
str.charAt(0) = 'Y';    //Error, invalid left-hand side in assignment

Der Grund, warum die Zuweisung zu string[x]nicht funktioniert, liegt darin, dass Javascript-Zeichenfolgen unveränderlich sind .

Donald Duck
quelle