Respuestas:
La notación de corchetes ahora funciona en todos los principales navegadores, excepto IE7 y versiones inferiores.
// Bracket Notation
"Test String1"[6]
// charAt Implementation
"Test String1".charAt(6)
Solía ser una mala idea usar corchetes, por estos motivos ( Fuente ):
Esta notación no funciona en IE7. El primer fragmento de código volverá indefinido en IE7. Si utiliza la notación de corchetes para cadenas en todo el código y desea migrar
.charAt(pos)
, esto es un verdadero dolor: los corchetes se usan en todo el código y no hay una manera fácil de detectar si es para una cadena o una matriz / objeto.No puede establecer el carácter con esta notación. Como no hay advertencia de ningún tipo, esto es realmente confuso y frustrante. Si estuviera utilizando la
.charAt(pos)
función, no habría tenido la tentación de hacerlo.
De MDN :
Hay dos formas de acceder a un carácter individual en una cadena. El primero es el
charAt
método, parte de ECMAScript 3:return 'cat'.charAt(1); // returns "a"
La otra forma es tratar la cadena como un objeto tipo matriz, donde cada carácter individual corresponde a un índice numérico. Esto ha sido admitido por la mayoría de los navegadores desde su primera versión, excepto IE. Fue estandarizado en ECMAScript 5:
return 'cat'[1]; // returns "a"
La segunda forma requiere compatibilidad con ECMAScript 5 (y no es compatible con algunos navegadores más antiguos).
En ambos casos, intentar cambiar un carácter individual no funcionará, ya que las cadenas son inmutables, es decir, sus propiedades no son ni "grabables" ni "configurables".
str.charAt(i)
es mejor desde una perspectiva de compatibilidad si se requiere compatibilidad con IE6 / IE7.str[i]
es más moderno y funciona en IE8 + y en todos los demás navegadores (todos Edge / Firefox / Chrome, Safari 2+, todos iOS / Android).Pueden dar resultados diferentes en casos extremos.
'hello'[NaN] // undefined
'hello'.charAt(NaN) // 'h'
'hello'[true] //undefined
'hello'.charAt(true) // 'e'
La función charAt depende de cómo se convierte el índice en un Número en la especificación .
'hello'[undefined] // undefined
y'hello'.charAt(undefined) //h
null
funciona como undefined
, pero mira esto: "hello"["00"] // undefined
pero "hello".charAt("00") // "h"
y"hello"["0"] // "h"
[]
.
.charAt()
realiza una conversión adicional para su parámetro en a Number
. Para su información, casi no hay diferencia de rendimiento hoy en día.
String.charAt () es el estándar original y funciona en todos los navegadores. En IE 8+ y otros navegadores, puede usar la notación de corchetes para acceder a los caracteres, pero IE 7 y versiones posteriores no lo admitieron.
Si alguien realmente quiere usar la notación de corchetes en IE 7, es aconsejable convertir la cadena a una matriz usando str.split('')
y luego usarla como una matriz, compatible con cualquier navegador.
var testString = "Hello";
var charArr = testString.split("");
charArr[1]; // "e"
Resultado muy interesante cuando prueba el descriptor de acceso al índice de cadena frente al charAt()
método Parece que Chrome es el único navegador que le gusta charAt
más.
index
también es mucho más rápido en cromo.
Hay una diferencia cuando intenta acceder a un índice que está fuera de los límites o no es un número entero.
string[x]
devuelve el carácter en la x
posición th en string
if x
es un número entero entre 0 y string.length-1
, y devuelve lo undefined
contrario.
string.charAt(x)
se convierte x
en un entero utilizando el proceso explicado aquí (que básicamente redondea x
hacia abajo si x
es un número no entero y devuelve 0 si parseInt(x)
es NaN
) y luego devuelve el carácter en esa posición si el entero está entre 0 y string.length-1
, de lo contrario, devuelve una cadena vacía .
Aquí hay unos ejemplos:
"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
Otra diferencia es que asignar a string[x]
no hace nada (lo que puede ser confuso) y asignar string.charAt(x)
es un error (como se esperaba):
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 razón por la que asignar a string[x]
no funciona es porque las cadenas de Javascript son inmutables .
"😃".charAt(0)
devolverá un carácter inutilizable