2012-03-21 13 views
7

seguito è alcuni codici e di uscita dalla console Chrome sviluppatoriPerché JavaScript split() produce output diversi con nomi di variabili diversi?

Caso 1:

var myarr = document.location.hostname.split("."); //typed 
undefined            //output 
myarr[0]            //typed 
"ptamz"            //output: ONE 

Caso 2:

var name = document.location.hostname.split(".");  //typed 
undefined            //output 
name[0]            //typed 
"p"             //output: TWO 

Perché sono le due uscite (Output commentato : ONE e Output: TWO) diversi?

Screenshot:

enter image description here

+2

Non è 'name' un termine riservato? forse è per questo. – jackJoe

+0

I due valori indefiniti sono attesi dal momento che la console di sviluppo emette ciò che l'espressione valuta (probabilmente lo sai, ma ho pensato che l'avrei buttato lì fuori).Il nome [0] e myarr [0] ... Deve essere come dice la risposta di James. – Corbin

+0

Uguale a [L'uso della variabile "nome" non funziona con un oggetto JS] (http://stackoverflow.com/q/10523701/1529630). Uno dovrebbe essere chiuso come duplicato dell'altro. – Oriol

risposta

13

name is a property of window. Sembra che quando si tenta di impostare quella proprietà su una matrice, le chiavi siano unite con una virgola (il risultato della chiamata toString on an array). Quindi stai impostando la proprietà window.name per la concatenazione di ogni elemento di document.location.hostname.split("."), separati da virgole.

Ecco uno screenshot dalla mia console Chrome dimostrando ciò che accade:

enter image description here

La ragione name[0] risultati poi in p è che è possibile accedere ai caratteri delle stringhe utilizzando le parentesi quadre:

name = "hello,world"; 
console.log(name[0]); //"h" 

Modifica

Come altri hanno già accennato, questo sarà solo il caso nell'ambito globale. Sei libero di dichiarare una variabile denominata name all'interno di un ambito discendente. Anche se, ovviamente, omettendo la parola chiave var in questo caso sarebbe ancora provocare in voi accesso window.name:

function example() { 
    var name = ["hello", "world"]; 
    console.log(name); //["hello", "world"] 
} 
+0

+1 ma ah ero così vicino ... –

+1

Vero. Se provate la riga 'var name = document.location.hostname.split (". ");' All'interno di una funzione, funziona come previsto, dal momento che var ha un ambito più ristretto rispetto all'oggetto globale e quindi ha la precedenza. Chrome si rifiuta di definire una nuova variabile "nome" se è già definita sull'oggetto 'window', quindi qualsiasi cosa assegnata ad essa verrà convertita in stringa. – Martijn

1

nome di portata globale è una stringa vuota, per cui in quest'ultimo caso si ottiene la matrice restituita dalla divisa trasformato in un stringa "www, hostname, com". Quindi nome [0] ti dà solo la prima lettera.

4

James ha ragione: perché name è una proprietà di stringa di window, se si sta eseguendo questo codice nel campo di applicazione globale si sta insieme che proprietà non la variabile. Pertanto, se si imposta un array, viene impostato su window.name la versione stringa di tale array (in pratica, array.toString() corrisponde a array.join()).

Poiché si tratta di una stringa, e non di un array, che utilizza la notazione quadrata consente di accedere al singolo carattere in base a un indice specifico. Quindi:

var str = "ptamz"; 
str[0] // "p" 
str[1] // "t" 

E 'equivalente a:

var str = "ptamz"; 
str.charAt(0) // "p" 
str.charAt(1) // "t" 
Problemi correlati