2011-05-09 23 views

Respuesta

194
// Bracket Notation 
"Test String1"[6] 

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

es una mala idea utilizar soportes, por estas razones (Source):

Esta notación no funciona en IE7. El primer fragmento de código devolverá indefinido en IE7. Si quieres pasar a utilizar la notación soporte para las cadenas de todo sobre su código y desea migrar a .charAt(pos), este es un verdadero dolor de cabeza: Los corchetes se utilizan en todo su código y no hay manera fácil de detectar si que es para una cadena o una matriz/objeto .

No puede establecer el carácter con esta notación. Como no hay ninguna advertencia de de ningún tipo, esto es realmente confuso y frustrante. Si estaba utilizando la función .charAt(pos), no lo haría .

Básicamente, es una notación de acceso directo que no está completamente implementada en todos los navegadores.

Nota: no puede escribir caracteres con ninguno de los métodos. Sin embargo, esa funcionalidad es un poco más fácil de entender con la función .charAt() que, en la mayoría de los idiomas, es una función de solo lectura.

+6

Cierto, la notación no funciona en IE7, pero eso no es una gran desventaja hoy en día. Mientras tanto, los puntos de referencia que hice mostraron una disminución de tres veces en el rendimiento al usar charAt vs indexador en Chrome cuando la cadena está encasillada en un objeto. Sé que eso no es realmente relevante, pero vale la pena señalarlo.https: //jsfiddle.net/mdasxxd2/ –

+4

Una prueba más precisa (benchmark.js) https://esbench.com/bench/579609a0db965b9a00965b9e – NoNameProvided

69

De MDN:

Hay dos maneras de acceder a un carácter individual en una cadena. El primero es el charAt método:

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

La otra forma es para tratar la cadena como una matriz, donde cada índice se corresponde con un carácter individual:

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

La segunda manera (el tratamiento de la cadena de como una matriz) no es parte de ECMAScript 3; es una función de JavaScript y ECMAScript 5 (y no es compatible con todos los navegadores).

En ambos casos, el intento de establecer un carácter individual no funcionará. Intentar establecer un carácter a través de charAt da como resultado un error, mientras que tratar de establecer un carácter a través de la indexación no arroja un error, pero la cadena en sí misma no se modifica.

Así que, como ya habrán descubierto, charAt() es mejor desde una perspectiva de compatibilidad.

+10

Es verdad, ECMA 5 no es pero compatible con TODOS los navegadores, pero ES compatible con los navegadores MOST: es decir, IE9 y superior y todas las versiones de Chrome/Firefox: http://kangax.github.io/compat-table/es5/#Property_access_on_strings Sin función JS será 100% compatible, y creo que evitar el uso de las funciones de ECMA 5 nos dejará en el pasado para siempre ... –

10

String.charAt() es el estándar y funciona en todos los navegadores. En los navegadores que no sean IE, puede usar la notación de corchetes para acceder a los caracteres, pero IE no los admite. (No estoy seguro si han implementado eso con las últimas versiones).

Si alguien realmente quiere usar la notación de soporte. Es aconsejable convertir la cadena a matriz de caracteres para que sea compatible con cualquier navegador.

var testString = "Hello"; 
var charArr = myString.split(''); 
+5

IE admite la notación de corchetes desde 8 en adelante. – mrec

+3

Este método se rompe cuando se trata de Unicode: http://mathiasbynens.be/notes/javascript-unicode –

+0

Este método sería ineficiente cuando se trata de cadenas realmente grandes porque duplicaría los datos en la memoria (la cadena original y la matriz) . – Daniel

54

que 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 el índice se convierte a un número en la spec.

+0

También '' hola '[undefined] // undefined' y '' hello'.charAt (undefined) // h' –

+2

' null' funciona como 'undefined', pero vea esto:' "hello" ["00"] // undefined' pero '" hello ".charAt (" 00 ") //" h "' y '" hello "[" 0 "] //" h "' – panzi

+3

Esto me convence de todo corazón de seguir usando '[]' . – ApproachingDarknessFish