Existe algum motivo para eu usar em string.charAt(x)
vez da notação de colchete string[x]
?
Existe algum motivo para eu usar em string.charAt(x)
vez da notação de colchete string[x]
?
Respostas:
A notação de colchete agora funciona em todos os principais navegadores, exceto no IE7 e abaixo.
// Bracket Notation
"Test String1"[6]
// charAt Implementation
"Test String1".charAt(6)
Costumava ser uma má idéia usar colchetes, por esses motivos ( Fonte ):
Essa notação não funciona no IE7. O primeiro trecho de código retornará indefinido no IE7. Se você usar a notação de colchete para cadeias de caracteres em todo o seu código e quiser migrar para
.charAt(pos)
, isso é um problema: os colchetes são usados em todo o código e não há uma maneira fácil de detectar se isso é para uma cadeia de caracteres ou uma matriz / objeto.Você não pode definir o personagem usando esta notação. Como não há nenhum aviso, isso é realmente confuso e frustrante. Se você estivesse usando a
.charAt(pos)
função, não teria tentado fazê-lo.
Do MDN :
Existem duas maneiras de acessar um caractere individual em uma sequência. O primeiro é o
charAt
método, parte do ECMAScript 3:return 'cat'.charAt(1); // returns "a"
A outra maneira é tratar a string como um objeto de matriz, em que cada caractere individual corresponde a um índice numérico. Isso é suportado pela maioria dos navegadores desde a primeira versão, exceto pelo IE. Foi padronizado no ECMAScript 5:
return 'cat'[1]; // returns "a"
A segunda maneira requer o suporte ao ECMAScript 5 (e não é suportado em alguns navegadores mais antigos).
Nos dois casos, tentar alterar um caractere individual não funcionará, pois as strings são imutáveis, ou seja, suas propriedades não são "graváveis" nem "configuráveis".
str.charAt(i)
é melhor do ponto de vista da compatibilidade se a compatibilidade com o IE6 / IE7 for necessária.str[i]
é mais moderno e funciona no IE8 + e em todos os outros navegadores (todos Edge / Firefox / Chrome, Safari 2+, todos iOS / Android).Eles podem dar resultados diferentes em casos extremos.
'hello'[NaN] // undefined
'hello'.charAt(NaN) // 'h'
'hello'[true] //undefined
'hello'.charAt(true) // 'e'
A função charAt depende de como o índice é convertido em um número na especificação .
'hello'[undefined] // undefined
e'hello'.charAt(undefined) //h
null
funciona assim undefined
, mas veja isto: "hello"["00"] // undefined
mas "hello".charAt("00") // "h"
e"hello"["0"] // "h"
[]
.
.charAt()
realiza uma conversão extra para seu parâmetro em a Number
. Para sua informação, quase não há diferença de desempenho atualmente.
String.charAt () é o padrão original e funciona em todos os navegadores. No IE 8+ e em outros navegadores, você pode usar a notação de colchete para acessar caracteres, mas o IE 7 e abaixo não o suportam.
Se alguém realmente deseja usar a notação de colchete no IE 7, é aconselhável converter a string em uma matriz usando str.split('')
e depois usá-la como uma matriz, compatível com qualquer navegador.
var testString = "Hello";
var charArr = testString.split("");
charArr[1]; // "e"
Resultado muito interessante quando você testa o acessador de índice de strings versus o charAt()
método Parece que o Chrome é o único navegador que gosta charAt
mais.
index
também é muito mais rápido no chrome.
Há uma diferença quando você tenta acessar um índice que está fora dos limites ou não é um número inteiro.
string[x]
retorna o caractere na x
posição th em string
se x
for um número inteiro entre 0 e string.length-1
, e retorna undefined
caso contrário.
string.charAt(x)
converte x
para um número inteiro usando o processo explicado aqui (que basicamente arredonda x
para baixo se x
é um número não inteiro e retorna 0 se parseInt(x)
for NaN
) e, em seguida, retorna o caractere nessa posição se o número inteiro estiver entre 0 e string.length-1
, e retorna uma string vazia, caso contrário .
aqui estão alguns exemplos:
"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
Outra diferença é que atribuir a string[x]
não faz nada (o que pode ser confuso) e atribuir a string.charAt(x)
é um erro (como esperado):
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
A razão pela qual atribuir a string[x]
não funciona é porque as strings Javascript são imutáveis .
"😃".charAt(0)
irá retornar um carácter inutilizável