Réponses:
La notation entre parenthèses fonctionne désormais sur tous les principaux navigateurs, à l'exception d'IE7 et des versions antérieures.
// Bracket Notation
"Test String1"[6]
// charAt Implementation
"Test String1".charAt(6)
Auparavant, c'était une mauvaise idée d'utiliser des crochets, pour ces raisons ( Source ):
Cette notation ne fonctionne pas dans IE7. Le premier extrait de code retournera non défini dans IE7. Si vous utilisez la notation entre crochets pour les chaînes partout dans votre code et que vous souhaitez migrer vers
.charAt(pos)
, c'est une vraie douleur: les crochets sont utilisés partout dans votre code et il n'y a pas de moyen facile de détecter si c'est pour une chaîne ou un tableau / objet.Vous ne pouvez pas définir le caractère en utilisant cette notation. Comme il n'y a aucun avertissement d'aucune sorte, c'est vraiment déroutant et frustrant. Si vous utilisiez la
.charAt(pos)
fonction, vous n'auriez pas été tenté de le faire.
De MDN :
Il existe deux façons d'accéder à un caractère individuel dans une chaîne. Le premier est la
charAt
méthode, qui fait partie d'ECMAScript 3:return 'cat'.charAt(1); // returns "a"
L'autre façon consiste à traiter la chaîne comme un objet de type tableau, où chaque caractère individuel correspond à un index numérique. Cela a été pris en charge par la plupart des navigateurs depuis leur première version, à l'exception d'IE. Il a été normalisé dans ECMAScript 5:
return 'cat'[1]; // returns "a"
La deuxième façon requiert la prise en charge d'ECMAScript 5 (et non prise en charge dans certains navigateurs plus anciens).
Dans les deux cas, tenter de changer un caractère individuel ne fonctionnera pas, car les chaînes sont immuables, c'est-à-dire que leurs propriétés ne sont ni "inscriptibles" ni "configurables".
str.charAt(i)
est préférable du point de vue de la compatibilité si la compatibilité IE6 / IE7 est requise.str[i]
est plus moderne et fonctionne dans IE8 + et tous les autres navigateurs (tous Edge / Firefox / Chrome, Safari 2+, tous iOS / Android).Ils peuvent donner des résultats différents dans les cas marginaux.
'hello'[NaN] // undefined
'hello'.charAt(NaN) // 'h'
'hello'[true] //undefined
'hello'.charAt(true) // 'e'
La fonction charAt dépend de la façon dont l'index est converti en un nombre dans la spécification .
'hello'[undefined] // undefined
et'hello'.charAt(undefined) //h
null
fonctionne comme undefined
, mais voyez ceci: "hello"["00"] // undefined
mais "hello".charAt("00") // "h"
et"hello"["0"] // "h"
[]
.
.charAt()
effectue une conversion supplémentaire pour son paramètre en a Number
. Pour info, il n'y a presque plus de différence de performance de nos jours.
String.charAt () est la norme d'origine et fonctionne dans tous les navigateurs. Dans IE 8+ et d'autres navigateurs, vous pouvez utiliser la notation entre parenthèses pour accéder aux caractères, mais IE 7 et les versions antérieures ne le prenaient pas en charge.
Si quelqu'un veut vraiment utiliser la notation entre crochets dans IE 7, il est sage de convertir la chaîne en un tableau en utilisant str.split('')
puis de l'utiliser comme un tableau, compatible avec n'importe quel navigateur.
var testString = "Hello";
var charArr = testString.split("");
charArr[1]; // "e"
Résultat très intéressant lorsque vous testez l'accesseur d'index de chaîne par rapport à la charAt()
méthode. Semble Chrome est le seul navigateur qui aime charAt
plus.
index
est beaucoup plus rapide en chrome aussi.
Il y a une différence lorsque vous essayez d'accéder à un index qui est hors limites ou non un entier.
string[x]
renvoie le caractère à la x
e position dans string
if x
est un entier compris entre 0 et string.length-1
, et renvoie undefined
sinon.
string.charAt(x)
convertit x
en un entier en utilisant le processus expliqué ici (qui arrondit essentiellement x
si x
est un nombre non entier et renvoie 0 si parseInt(x)
est NaN
), puis retourne le caractère à cette position si l'entier est compris entre 0 et string.length-1
, et renvoie une chaîne vide sinon .
Voici quelques exemples:
"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
Une autre différence est que l'attribution à string[x]
ne fait rien (ce qui peut être déroutant) et l'attribution à string.charAt(x)
est une erreur (comme prévu):
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
La raison pour laquelle l'attribution à string[x]
ne fonctionne pas est que les chaînes Javascript sont immuables .
"😃".charAt(0)
renverra un caractère inutilisable