Antworten:
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.
Von MDN :
Es gibt zwei Möglichkeiten, auf ein einzelnes Zeichen in einer Zeichenfolge zuzugreifen. Die erste ist die
charAt
Methode, 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).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 .
'hello'[undefined] // undefined
und'hello'.charAt(undefined) //h
null
funktioniert wie undefined
, aber sehen Sie dies: "hello"["00"] // undefined
aber "hello".charAt("00") // "h"
und"hello"["0"] // "h"
[]
.
.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.
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"
Sehr interessantes Ergebnis, wenn Sie den String-Index-Accessor mit der charAt()
Methode testen . Chrome scheint der einzige Browser zu sein, der charAt
mehr mag .
index
ist auch in Chrom viel schneller.
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 x
th-Position in string
if zurück, wenn x
es eine Ganzzahl zwischen 0 und ist string.length-1
, und gibt undefined
andernfalls zurück.
string.charAt(x)
umwandelt x
in eine Ganzzahl unter Verwendung des Verfahrens erläutert hier (die rundet grundsätzlich x
ab , wenn x
eine 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-1
ansonsten, 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 .
"😃".charAt(0)
wird ein unbrauchbares Zeichen zurückgegeben