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


Risposte:


243

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.


21
È vero, la notazione non funziona in IE7, ma questo non è uno svantaggio enorme al giorno d'oggi. Nel frattempo, i benchmark che ho fatto hanno mostrato una riduzione di tre volte delle prestazioni quando si utilizza charAt vs indexer in Chrome quando la stringa è racchiusa in un oggetto. So che non è davvero rilevante, ma vale comunque la pena notare. jsfiddle.net/mdasxxd2
Zackwehdex

5
Un test più accurato (benchmark.js) esbench.com/bench/579609a0db965b9a00965b9e
NoNameProvided

3
Nonostante sia il punteggio più alto, questa risposta è ora (2019) notevolmente obsoleta. Si dovrebbe invece fare riferimento alla risposta sotto citando MDN .
Scott Martin,

97

Da MDN :

Esistono due modi per accedere a un singolo carattere in una stringa. Il primo è il charAtmetodo, 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).

19
È vero, ECMA 5 non è ancora supportato su TUTTI i browser, ma È supportato sulla maggior parte dei browser: significa IE9 e versioni successive e tutte le versioni di Chrome / Firefox: kangax.github.io/compat-table/es5/#Property_access_on_strings Nessuna funzionalità JS mai essere supportato al 100% e ritengo che evitare l'uso delle funzionalità ECMA 5 ci lascerà per sempre nel passato ...
Danny R

83

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 .


Inoltre 'hello'[undefined] // undefinede'hello'.charAt(undefined) //h
Juan Mendes, il

3
nullfunziona come undefined, ma vedi questo: "hello"["00"] // undefinedma "hello".charAt("00") // "h"e"hello"["0"] // "h"
panzi

11
Questo mi convince con tutto il cuore per continuare ad usare [].
Approaching

Questo significa anche che .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.
Константин Ван,

7
Questa risposta dovrebbe spostarsi verso l'alto, in realtà spiega che esiste una differenza tra i 2 metodi. Le altre risposte parlano di compatibilità con IE7 (intendo davvero?) Mentre questa risposta spiega una vera trappola.
Storm Muller,

11

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"

5
IE supporta la notazione parentesi a partire dall'8.
mrec,

3
Questo metodo si interrompe quando si ha a che fare con Unicode: mathiasbynens.be/notes/javascript-unicode
Jeremy J Starcher

Questo metodo sarebbe inefficiente quando si tratta di stringhe molto grandi perché duplica i dati in memoria (la stringa originale e l'array).
Daniel,


5

C'è una differenza quando si tenta di accedere a un indice fuori limite o non un numero intero.

string[x]restituisce il carattere in xposizione th in stringse xè un numero intero compreso tra 0 e string.length-1, e restituisce undefinedaltrimenti.

string.charAt(x)converte xin un numero intero usando il processo spiegato qui (che sostanzialmente arrotonda xse 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 .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.