C'è qualche motivo che dovrei usare al string.charAt(x)
posto della notazione parentesi string[x]
?
C'è qualche motivo che dovrei usare al string.charAt(x)
posto della notazione parentesi string[x]
?
Risposte:
La notazione con parentesi ora funziona su tutti i principali browser, ad eccezione di IE7 e versioni precedenti.
// Bracket Notation
"Test String1"[6]
// charAt Implementation
"Test String1".charAt(6)
Era una cattiva idea usare le parentesi, per questi motivi ( Fonte ):
Questa notazione non funziona in IE7. Il primo frammento di codice verrà restituito indefinito in IE7. Se ti capita di usare la notazione parentesi per le stringhe in tutto il codice e vuoi migrare
.charAt(pos)
, questo è un vero problema: le parentesi vengono utilizzate in tutto il codice e non esiste un modo semplice per rilevare se è per una stringa o un array / oggetto.Non puoi impostare il personaggio usando questa notazione. Poiché non vi è alcun avviso di alcun tipo, questo è davvero confuso e frustrante. Se avessi usato la
.charAt(pos)
funzione, non saresti stato tentato di farlo.
Da MDN :
Esistono due modi per accedere a un singolo carattere in una stringa. Il primo è il
charAt
metodo, parte di ECMAScript 3:return 'cat'.charAt(1); // returns "a"
L'altro modo è di trattare la stringa come un oggetto simile a un array, in cui ogni singolo carattere corrisponde a un indice numerico. Questo è stato supportato dalla maggior parte dei browser sin dalla loro prima versione, ad eccezione di IE. È stato standardizzato in ECMAScript 5:
return 'cat'[1]; // returns "a"
Il secondo modo richiede il supporto ECMAScript 5 (e non supportato in alcuni browser meno recenti).
In entrambi i casi, il tentativo di modificare un singolo carattere non funzionerà, poiché le stringhe sono immutabili, ovvero le loro proprietà non sono né "scrivibili" né "configurabili".
str.charAt(i)
è migliore dal punto di vista della compatibilità se è richiesta la compatibilità IE6 / IE7.str[i]
è più moderno e funziona in IE8 + e in tutti gli altri browser (tutti Edge / Firefox / Chrome, Safari 2+, tutti iOS / Android).Possono dare risultati diversi in casi limite.
'hello'[NaN] // undefined
'hello'.charAt(NaN) // 'h'
'hello'[true] //undefined
'hello'.charAt(true) // 'e'
La funzione charAt dipende da come l'indice viene convertito in un numero nella specifica .
'hello'[undefined] // undefined
e'hello'.charAt(undefined) //h
null
funziona come undefined
, ma vedi questo: "hello"["00"] // undefined
ma "hello".charAt("00") // "h"
e"hello"["0"] // "h"
[]
.
.charAt()
esegue una conversione extra per il suo parametro in a Number
. Cordiali saluti, al giorno d'oggi non c'è quasi alcuna differenza di prestazioni.
String.charAt () è lo standard originale e funziona in tutti i browser. In IE 8+ e altri browser, è possibile utilizzare la notazione parentesi per accedere ai caratteri, ma IE 7 e versioni precedenti non lo supportano.
Se qualcuno vuole davvero usare la notazione parentesi in IE 7, è saggio convertire la stringa in un array usando str.split('')
e quindi usarlo come un array, compatibile con qualsiasi browser.
var testString = "Hello";
var charArr = testString.split("");
charArr[1]; // "e"
Risultato molto interessante quando si verifica l'accessor dell'indice di stringa rispetto al charAt()
metodo. Sembra che Chrome sia l'unico browser a cui piace di charAt
più.
index
è molto più veloce anche in Chrome.
C'è una differenza quando si tenta di accedere a un indice fuori limite o non un numero intero.
string[x]
restituisce il carattere in x
posizione th in string
se x
è un numero intero compreso tra 0 e string.length-1
, e restituisce undefined
altrimenti.
string.charAt(x)
converte x
in un numero intero usando il processo spiegato qui (che sostanzialmente arrotonda x
se x
è un numero non intero e restituisce 0 se lo parseInt(x)
è NaN
) e quindi restituisce il carattere in quella posizione se il numero intero è compreso tra 0 e string.length-1
, altrimenti restituisce una stringa vuota .
Ecco alcuni esempi:
"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
Un'altra differenza è che l'assegnazione a string[x]
non fa nulla (che può essere fonte di confusione) e l'assegnazione a string.charAt(x)
è un errore (come previsto):
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
Il motivo per cui l'assegnazione a string[x]
non funziona è perché le stringhe Javascript sono immutabili .
"😃".charAt(0)
restituirà un carattere inutilizzabile