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

247

Y a-t-il une raison pour laquelle je devrais utiliser string.charAt(x)la notation entre crochets string[x]?

Mixeur
la source
3
Avertissement : l'utilisation de la syntaxe pour les emojis ou tout autre caractère unicode après le BPM du plan multilingue de base (également appelé "plan astral" ) "😃".charAt(0)renverra un caractère inutilisable
KyleMit

Réponses:

243

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.

Brian Webster
la source
21
Certes, la notation ne fonctionne pas dans IE7, mais ce n'est pas un énorme inconvénient de nos jours. Pendant ce temps, les tests de performance que j'ai effectués ont montré une diminution de trois fois des performances lors de l'utilisation de charAt vs indexer dans Chrome lorsque la chaîne est encadrée dans un objet. Je sais que ce n'est pas vraiment pertinent, mais mérite d'être noté. jsfiddle.net/mdasxxd2
Siderite Zackwehdex
5
Un test plus précis (benchmark.js) esbench.com/bench/579609a0db965b9a00965b9e
NoNameProvided
3
Bien qu'elle soit la mieux notée, cette réponse est désormais (2019) considérablement obsolète. La réponse ci-dessous citant MDN doit être mentionnée à la place.
Scott Martin
97

De MDN :

Il existe deux façons d'accéder à un caractère individuel dans une chaîne. Le premier est la charAtmé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).
Matt Ball
la source
19
Certes, ECMA 5 n'est pas encore pris en charge sur TOUS les navigateurs, mais il EST pris en charge sur la plupart des navigateurs: IE9 et supérieur et toutes les versions de Chrome / Firefox: kangax.github.io/compat-table/es5/#Property_access_on_strings Aucune fonctionnalité JS ne sera jamais être 100% pris en charge, et je pense qu'éviter l'utilisation des fonctionnalités ECMA 5 nous laissera dans le passé pour toujours ...
Danny R
84

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 .

MarkG
la source
Aussi 'hello'[undefined] // undefinedet'hello'.charAt(undefined) //h
Juan Mendes
3
nullfonctionne comme undefined, mais voyez ceci: "hello"["00"] // undefinedmais "hello".charAt("00") // "h"et"hello"["0"] // "h"
panzi
11
Cela me convainc de tout cœur de continuer à utiliser [].
ApproachingDarknessFish
Cela signifie également que .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.
Константин Ван
7
Cette réponse devrait remonter, elle explique en fait qu'il y a une différence entre les 2 méthodes. Les autres réponses parlent de compatibilité pour IE7 (je veux dire vraiment?) Tandis que cette réponse explique un écueil très réel.
Storm Muller
11

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"
CharithJ
la source
5
IE prend en charge la notation entre crochets à partir de 8.
mrec
3
Cette méthode se casse en traitant avec Unicode: mathiasbynens.be/notes/javascript-unicode
Jeremy J Starcher
Cette méthode serait inefficace lorsqu'il s'agit de très grandes chaînes car elle dupliquerait les données en mémoire (la chaîne d'origine et le tableau).
Daniel
8

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 charAtplus.

CharAt vs index 1

Graphique vs indice 2

Graphique vs indice 3

Arman McHitarian
la source
1
Ce n'est plus le cas. indexest beaucoup plus rapide en chrome aussi.
mako-taco
5

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 xe position dans stringif xest un entier compris entre 0 et string.length-1, et renvoie undefinedsinon.

string.charAt(x)convertit xen un entier en utilisant le processus expliqué ici (qui arrondit essentiellement xsi xest 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 .

Donald Duck
la source