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

为什么JavaScript split()使用不同的变量名生成不同的输出?,javascript,Javascript,以下是Chrome开发者控制台的一些代码和输出 案例1: var myarr = document.location.hostname.split("."); //typed undefined //output myarr[0] //typed "ptamz"

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

案例1:

var myarr = document.location.hostname.split(".");    //typed
undefined                                             //output
myarr[0]                                              //typed
"ptamz"                                               //output: ONE
var name = document.location.hostname.split(".");     //typed
undefined                                             //output
name[0]                                               //typed
"p"                                                   //output: TWO
案例2:

var myarr = document.location.hostname.split(".");    //typed
undefined                                             //output
myarr[0]                                              //typed
"ptamz"                                               //output: ONE
var name = document.location.hostname.split(".");     //typed
undefined                                             //output
name[0]                                               //typed
"p"                                                   //output: TWO
为什么这两个输出(注释输出:1和输出:2)不同

截图:

。似乎当您尝试将该属性设置为数组时,键会用逗号(调用的结果)连接起来。因此,实际上您正在将
window.name
属性设置为
document.location.hostname.split(“.”)的每个元素的串联,用逗号分隔

下面是我的Chrome控制台的屏幕截图,演示了发生的情况:

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

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

正如其他人所提到的,这只会在全球范围内发生。您可以在子体范围内自由声明名为
name
的变量。尽管很明显,在本例中省略
var
关键字仍会导致您访问
窗口。name

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

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

詹姆斯是对的:因为
name
window
的字符串属性,如果您在全局范围内执行此代码,则设置该属性而不是变量。因此,如果您设置一个数组,它将设置为该数组的字符串版本
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"

name
不是保留的术语吗?也许这就是原因。这两个未定义的是预期的,因为开发人员控制台输出表达式的计算结果(你可能知道,但我只是想把它扔出去)。名称[0]和myarr[0]。。。必须如詹姆斯的回答所说。和。其中一个应作为另一个的副本关闭。True。如果您尝试行
var name=document.location.hostname.split(“.”)在函数内部,它按预期工作,因为该变量的作用域比全局对象窄,因此优先。如果已经在
窗口
对象上定义了新的“name”变量,Chrome将拒绝定义该变量,因此您分配给它的任何内容都将转换为字符串。