为什么JavaScript split()会使用不同的变量名生成不同的输出?

时间:2012-03-21 08:47:38

标签: javascript

以下是Chrome开发者控制台的一些代码和输出

案例1:

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

案例2:

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

为什么两个输出(注释输出:ONE和输出:TWO)不同?

截图:

enter image description here

3 个答案:

答案 0 :(得分:13)

name is a property of window。看来,当您尝试将该属性设置为数组时,键将以逗号(调用toString on an array的结果)连接。因此,您实际上将window.name属性设置为document.location.hostname.split(".")的每个元素的串联,以逗号分隔。

以下是我的Chrome控制台的屏幕截图,演示了会发生什么:

enter image description here

name[0]导致p的原因是您可以使用方括号访问字符串的字符:

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

修改

正如其他人所提到的,这只是全球范围内的情况。您可以在后代范围内声明名为name的变量。显然,在这种情况下省略var关键字仍会导致您访问window.name

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

答案 1 :(得分:4)

James是对的:因为namewindow的字符串属性,如果您在全局范围内执行此代码,则设置 属性不是您的变量。因此,如果您设置了一个数组,它会将window.name设置为该数组的字符串版本(基本上array.toString()array.join()相同)。

因为它是一个字符串 - 而不是数组 - 使用方形表示法,您可以根据特定索引访问单个字符。所以:

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

相当于:

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

答案 2 :(得分:1)

全局范围内的名称是一个空字符串,因此在后一种情况下,您将通过拆分返回的数组转换为字符串“www,hostname,com”。所以name [0]只能获得第一个字母。