Che cos’è “undefined x 1” in JavaScript?

Sto facendo alcuni piccoli esperimenti basati su questo post di blog .

Sto facendo questa ricerca nel debugger di Google Chrome e qui arriva la parte difficile.

Che diamine è questo ?!

Ho il fatto che non riesco a cancellare le variabili locali (dato che non sono attributi dell’object). Capisco che posso ‘leggere’ tutti i parametri passati ad una funzione dall’array chiamato ‘argomenti‘. Ho anche capito che non riesco a cancellare e l’elemento dell’array, solo per ottenere che l’ array[0] abbia un valore non definito.

Qualcuno può spiegarmi cosa significa undefined x 1 nell’immagine incorporata?

E quando sovrascrivo la funzione foo per restituire gli arguments[0] , ottengo il solito e ‘normale’ indefinito.

Questo è solo un esperimento, ma sembra interrestarsi, qualcuno sa a cosa si riferisce undefined x 1 ?

Sembra essere il nuovo modo di mostrare gli indici non inizializzati di Chrome in array (e oggetti simili a una matrice ):

 > Array(100) [undefined × 100] 

Che è sicuramente meglio della stampa [undefined, undefined, undefined,...] o comunque lo era prima.

Anche se, se esiste un solo valore undefined , è ansible eliminare l’ x 1 .

Google Chrome sembra scegliere di visualizzare array sparsi utilizzando questa notazione undefined xn . [undefined, undefined] se non è un array sparse:

 var arr = new Array(2); console.log(arr); var arr2 = []; arr2[3] = 123; console.log(arr2); var arr3 = [,,,]; console.log(arr3) var arr4 = [,]; console.log(arr4) var arr5 = [undefined, undefined] console.log(arr5) var arr6 = [undefined] console.log(arr6) 

arr1 a arr4 sono tutti array sparsi, mentre arr5 e arr6 no. Chrome li mostrerà come:

 [undefined × 2] [undefined × 3, 123] [undefined × 3] [undefined × 1] [undefined, undefined] [undefined] 

si noti [undefined x 1] per l’array sparse.

Dato che hai eliminato un elemento, ne consegue che: Se elimini un elemento da una matrice, la matrice diventa sparsa.

Ecco come appare, digitare questo codice nella console chrome devtools: –

 arr = new Array(4); arr[2] = "adf"; console.log(arr); // [undefined × 2, "adf", undefined × 1] 

Guarda i primi due “non definiti” consecutivi che sono rappresentati da * 2, per mostrare che ci sono due numeri indefiniti consecutivi lì

Le versioni più recenti di Chrome utilizzano empty × anziché empty × non undefined × per rendere la differenza un po ‘più chiara.

Ad esempio, inserendo [, undefined] nella console di DevTools risulta:

 ▶(2) [empty × 1, undefined] 

ed esaminando le chiavi in:

 ▼(2) [empty × 1, undefined] 1: undefined length: 2 ▶__proto__: Array(0) 

E ‘successo anche a me. Apri la stessa cosa in un altro browser e visualizza / registra l’array sulla console. Finché funziona sia in crome che in firefox nello stesso modo (come nell’accesso agli elementi funziona bene anche se l’output ha undefinedx1), lo considero una specie di bug in Chrome che non rinfresca qualcosa internamente. In realtà puoi testarlo in questo modo:

  1. Stavo aggiungendo elementi a un array e sparando a console.log () per registrare l’elemento, per verificare se fosse indefinito o meno. Erano tutti definiti.
  2. Dopo push () ho registrato l’array e sembrava che quando ciò accadeva, era sempre l’ultimo a essere indefinito x 1 su Chrome.
  3. Poi ho provato a registrarlo più volte e anche più tardi, ma con lo stesso risultato.
  4. Tuttavia quando ho accesso (per motivi di output), l’elemento dal suo indice, ha restituito il valore corretto (divertente).
  5. Dopo di che ho registrato di nuovo l’array e ho detto che l’ultimo indice non era definito x 1 (quello che ho appena avuto accesso direttamente con successo!).
  6. Poi ho fatto un ciclo for sull’array, loggando o usando ogni elemento, tutto si è mostrato bene.
  7. Quindi un altro registro sull’array, ancora buggato.

    Il codice che sto usando originariamente ha i controlli per undefined e non hanno sparato, ma stavo vedendo tutti questi indefiniti nella console e mi stava infastidendo (nessun gioco di parole).

Vale anche la pena leggere: variabili Unitializzate in un array quando si usa solo Array.push? Sto usando anche pop () nel mio codice ed è una spiegazione ragionevole che il log della console in realtà rappresenti uno stato diverso nel tempo (quando il codice è ‘fermato’).