2012-03-21 17 views
7

A continuación se presenta algunos códigos y de salida de la consola del cromo de los desarrolladores¿Por qué JavaScript divide() produce resultados diferentes con diferentes nombres de variables?

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 

¿Por qué son las dos salidas (Output comentado : ONE, y Output: TWO) ¿diferente?

Captura de pantalla:

enter image description here

+2

no es 'name' un término reservado? tal vez por eso. – jackJoe

+0

Se esperan los dos indefinidos ya que la consola de desarrollo genera lo que evalúa la expresión (probablemente lo sepas, pero pensé que lo lanzaría allí).El nombre [0] y myarr [0] ... Debe ser como dice la respuesta de James. – Corbin

+0

Igual que [El uso de la variable "nombre" no funciona con un objeto JS] (http://stackoverflow.com/q/10523701/1529630). Uno debe ser cerrado como duplicado del otro. – Oriol

Respuesta

13

name is a property of window. Parece que cuando intenta establecer esa propiedad en una matriz, las teclas se unen con una coma (el resultado de llamar al toString on an array). Por lo tanto, en realidad está configurando la propiedad window.name en la concatenación de cada elemento de document.location.hostname.split("."), separados por comas.

Aquí hay una captura de pantalla de mi consola de Chrome que demuestra lo que sucede:

enter image description here

La razón name[0] luego se traduce en p es que se puede acceder a los caracteres de cadenas utilizando corchetes:

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

Editar

Como han mencionado otros, este solo será el caso en el ámbito global. Usted es libre de declarar una variable llamada name dentro de un alcance descendente. Aunque, obviamente, omitiendo la palabra clave var en este caso sería aún dar lugar a que el acceso a window.name:

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

+1 pero ah estaba tan cerca ... –

+1

Es cierto. Si prueba la línea 'var name = document.location.hostname.split (". ");' Dentro de una función, funciona como se esperaba, ya que esa var tiene un alcance más estrecho que el objeto global, por lo que tiene prioridad. Chrome se niega a definir una nueva variable 'nombre' si ya está definida en el objeto 'ventana', por lo que cualquier cosa que le asigne se convertirá en cadena. – Martijn

1

nombre de ámbito mundial es una cadena vacía, por lo que en este último caso se obtiene la matriz devuelta por división transforma en una cadena "www, nombre de host, com". Entonces, el nombre [0] le proporciona la primera letra solamente.

4

James tiene razón: porque name es una propiedad de cadena de window, si está ejecutando el código en el ámbito global ya está listo que su propiedad no variable. Por lo tanto, si configura una matriz, establece en window.name la versión de cadena de esa matriz (básicamente, array.toString() que es lo mismo de array.join()).

Debido a que es una cadena, y no una matriz, el uso de la notación cuadrada le permite acceder al carácter individual basado en un índice específico. Por lo tanto:

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

Es equivalente a:

var str = "ptamz"; 
str.charAt(0) // "p" 
str.charAt(1) // "t" 
Cuestiones relacionadas