Il metodo String dell'oggetto charAt() restituisce una nuova stringa che consiste nella singola unità di codice UTF-16 situata nell'offset specificato nella stringa.

Sintassi

carattere = str.charAt(indice)

Parametri

index
Un numero intero compreso tra 0 e 1-meno della lunghezza della stringa. Se non viene fornito alcun indice, il valore predefinito è 0, quindi viene restituito il primo carattere nella stringa.

Valore restituito

Una stringa che rappresenta il carattere (esattamente un'unità di codice UTF-16) nell'indice specificato; stringa vuota se index non è compreso nell'intervallo

Descrizione

I caratteri in una stringa sono indicizzati da sinistra a destra. L'indice del primo carattere è 0 e l'indice dell'ultimo carattere in una stringa chiamata stringName è stringName.length - 1. Se l'indice che fornisci è fuori da questo intervallo, JavaScript restituisce una stringa vuota.

Se non viene fornito alcun indice per charAt(), il valore predefinito è 0.

Esempi

Visualizzazione di caratteri in posizioni diverse in una stringa

Nell'esempio seguente vengono visualizzati caratteri in posizioni diverse nella stringa "Brave new world":

var anyString = 'Brave new world';
console.log("Il carattere nell'indice 0 è '" + anyString.charAt()   + "'"); 
// Non è stato fornito alcun indice, usato 0 come predefinito

console.log("The character at index 0   is '" + anyString.charAt(0)   + "'");
console.log("The character at index 1   is '" + anyString.charAt(1)   + "'");
console.log("The character at index 2   is '" + anyString.charAt(2)   + "'");
console.log("The character at index 3   is '" + anyString.charAt(3)   + "'");
console.log("The character at index 4   is '" + anyString.charAt(4)   + "'");
console.log("The character at index 999 is '" + anyString.charAt(999) + "'");

Queste righe mostrano quanto segue:

//Il carattere nell'indice 0   is 'B'

//Il carattere nell'indice 0   is 'B'
//Il carattere nell'indice 1   is 'r'
//Il carattere nell'indice 2   is 'a'
//Il carattere nell'indice 3   is 'v'
//Il carattere nell'indice 4   is 'e'
//Il carattere nell'indice 999 is ''

Recupero di caratteri interi

Quanto segue fornisce un mezzo per garantire che l'attraversamento di un loop string fornisca sempre un intero carattere, anche se la stringa contiene caratteri che non si trovano nel piano multi-lingue di base.

var str = 'A \uD87E\uDC04 Z'; // Potremmo anche usare direttamente un carattere non-BMP
for (var i = 0, chr; i < str.length; i++) {
  if ((chr = getWholeChar(str, i)) === false) {
    continue;
  }
  // Adatta questa linea all'inizio di ogni ciclo, passando l'intera stringa e
  // l'iterazione corrente e il ritorno di una variabile per rappresentare il
  // personaggio individuale

  console.log(chr);
}

function getWholeChar(str, i) {
  var code = str.charCodeAt(i);

  if (Number.isNaN(code)) {
    return ''; // Posizione non trovata
  }
  if (code < 0xD800 || code > 0xDFFF) {
    return str.charAt(i);
  }

  // Alto surrogato (potrebbe cambiare l'ultimo esadecimale a 0xDB7F per trattare un alto privato
   // si surroga come singoli caratteri)
  if (0xD800 <= code && code <= 0xDBFF) {
    if (str.length <= (i + 1)) {
      throw 'Alto surrogato senza seguire un surrogato basso';
    }
    var next = str.charCodeAt(i + 1);
      if (0xDC00 > next || next > 0xDFFF) {
        throw 'Alto surrogato senza seguire un surrogato basso';
      }
      return str.charAt(i) + str.charAt(i + 1);
  }
  // Low surrogate (0xDC00 <= code && code <= 0xDFFF)
  if (i === 0) {
    throw 'Basso surrogato senza precedente surrogato elevato';
  }
  var prev = str.charCodeAt(i - 1);

  // (could change last hex to 0xDB7F to treat high private
  // surrogates as single characters)
  if (0xD800 > prev || prev > 0xDBFF) {
    throw 'Basso surrogato senza precedente surrogato elevato';
  }
  // Ora possiamo passare sopra surrogati bassi come secondo componente
   // in una coppia che abbiamo già elaborato
  return false;
}

In un ambiente ECMAScript 2016 che consente l'assegnazione destrutturata, la seguente è un'alternativa più succinta e un po 'più flessibile in quanto incrementa automaticamente una variabile incrementale (se il carattere lo richiede in quanto coppia surrogata).

var str = 'A\uD87E\uDC04Z'; // Potremmo anche usare direttamente un carattere non-BMP
for (var i = 0, chr; i < str.length; i++) {
  [chr, i] = getWholeCharAndI(str, i);
  // Adatta questa linea all'inizio di ogni ciclo, passando l'intera stringa e
  // l'iterazione corrente e la restituzione di un array con il singolo carattere
  // e valore "i" (modificato solo se una coppia surrogata)

  console.log(chr);
}
function getWholeCharAndI(str, i) {
  var code = str.charCodeAt(i);
  if (Number.isNaN(code)) {
    return ''; // Posizione non trovata
  }
  if (code < 0xD800 || code > 0xDFFF) {
    return [str.charAt(i), i]; // Carattere normale, mantenendo 'i' lo stesso
  }
  // Alto surrogato (potrebbe cambiare l'ultimo esadecimale a 0xDB7F per trattare un alto privato
  // si surroga come singoli caratteri)
  if (0xD800 <= code && code <= 0xDBFF) {
    if (str.length <= (i + 1)) {
      throw "Alto surrogato senza seguire un surrogato basso";
    }
    var next = str.charCodeAt(i + 1);
      if (0xDC00 > next || next > 0xDFFF) {
        throw "Alto surrogato senza seguire un surrogato basso";
      }
      return [str.charAt (i) + str.charAt (i + 1), i + 1];
  }
  // Basso surrogato (0xDC00 <= code && code <= 0xDFFF)
  if (i === 0) {
    throw "Basso surrogato senza precedente surrogato elevato";
  }
  var prev = str.charCodeAt(i - 1);
  // (potrebbe cambiare l'ultimo esadecimale in 0xDB7F per trattare i surrogati ad alto livello privato
  // come singoli caratteri)
  if (0xD800 > prev || prev > 0xDBFF) {
    throw "Basso surrogato senza precedente surrogato elevato";
  }
  // Restituisce invece il carattere successivo (e incrementa)
  return [str.charAt(i + 1), i + 1];
}

Correggere charAt() per supportare caratteri non-Basic-Multilingual-Plane (BMP)

Mentre l'esempio sopra può essere più frequentemente utile per coloro che desiderano supportare caratteri non BMP (dal momento che non richiede al chiamante di sapere dove potrebbe apparire un personaggio non BMP), nel caso in cui uno lo desideri, nella scelta di un personaggio per indice, per trattare le coppie surrogate all'interno di una stringa come i singoli caratteri che rappresentano, si può usare quanto segue:

function fixedCharAt(str, idx) {
  var ret = '';
  str += '';
  var end = str.length;

  var surrogatePairs = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g;
  while ((surrogatePairs.exec(str)) != null) {
    var li = surrogatePairs.lastIndex;
    if (li - 2 < idx) {
      idx++;
    } else {
      break;
    }
  }

  if (idx >= end || idx < 0) {
    return '';
  }

  ret += str.charAt(idx);

 if (/[\uD800-\uDBFF]/.test(ret) && /[\uDC00-\uDFFF]/.test(str.charAt(idx + 1))) {
    // Vai avanti, poiché uno dei "personaggi" fa parte di una coppia di sostituti
    ret += str.charAt(idx + 1);
  }
  return ret;
}

Specificazioni

Specificazioni Stato Commenti
ECMAScript 1st Edition (ECMA-262) Standard definizione iniziale.
ECMAScript 5.1 (ECMA-262)
The definition of 'String.prototype.charAt' in that specification.
Standard  
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'String.prototype.charAt' in that specification.
Standard  
ECMAScript Latest Draft (ECMA-262)
The definition of 'String.prototype.charAt' in that specification.
Draft  

Compatibilità con il browser

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidEdge MobileFirefox for AndroidOpera for AndroidiOS SafariSamsung InternetNode.js
Basic supportChrome Full support YesEdge Full support YesFirefox Full support 1IE Full support YesOpera Full support YesSafari Full support YesWebView Android Full support YesChrome Android Full support YesEdge Mobile Full support YesFirefox Android Full support 4Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support Yes

Legend

Full support  
Full support

Guarda anche

Tag del documento e collaboratori

Hanno collaborato alla realizzazione di questa pagina: ladysilvia
Ultima modifica di: ladysilvia,