保留字行为

6

当我在创建一个基于计数器的小游戏时,我有一个类似这样的数组:

var status = ["day","dusk","night","dawn"];

如果我试图访问数组的第一个索引,会得到以下结果:
console.log(status[0]); //yields "d"

@monners提到可能是一个保留字,所以我把变量名改成了xstatus,然后它就正常工作了。

我的问题是:为什么status[0]只返回第一个索引的第一个字母?


1
我在 jsFiddle 上获得了完整的“day”查看 http://jsfiddle.net/fZbes/ - Jayantha Lal Sirisena
也许你在别处有另一个名为status的变量,或者你覆盖了你的变量? - Brandon Boone
1
@Jayantha 是的,因为 jsfiddle 的窗口不包含状态。例如,尝试在 Chrome 控制台中自己完成它。 - ioan
4
@Gamster:这是因为fiddle中的代码未在全局范围内执行。 - Felix Kling
3
我们已经确定 window.status 是一个特殊的变量。它曾用于设置网站状态文本,但现在浏览器几乎不再显示该文本。这意味着该变量的值只能是字符串,因此你给它分配的任何值都会被隐式转换为字符串。 - Felix Kling
显示剩余5条评论
4个回答

6
您正在修改无法设置为数组的window.status属性: https://developer.mozilla.org/en-US/docs/Web/API/Window.status
在Firefox中存在一些未解释的行为。尽管全局范围内的statusvar status都提供对window.status属性的引用,但var status不会展开该数组:
status = ["meagar"];
console.log(window.status[0]); // 'm'

vs

var status = ["meagar"];
console.log(window.status[0]); // 'meagar'

2
@RubenKazumov 是的,没错。如果你不在全局作用域下,使用 var 只会创建一个本地变量。在全局作用域下使用 var status 只是给你一个对 window 的现有属性的引用。 - user229044
2
@RubenKazumov 错了,var status = statusstatus = [...] 从来不一样,但是 var status = xstatus = x 在全局作用域下都等同于 window.status = x - user229044
1
顺便提一下,事实证明Firefox在全局范围内对statusvar status的处理是不同的:http://jsfiddle.net/PQN2P/。至少我在第一种情况下得到了`d`,而在第二种情况下得到了`day`。 - Felix Kling
嗯,有趣。我在OS X 10.9上使用的是FF 26。 - Felix Kling
啊,我懂你的意思了,抱歉。它的行为不同,但仍然是对 window.status 的引用。是的,在Firefox中,它似乎接受一个数组,但只有在使用var status时才行。非常奇怪。 - user229044
显示剩余7条评论

2
因为它将把你的数组保存为一个扁平字符串,d 是字符串的第一个字符(位置为0)。
我相信这一点可以追溯到旧的 Navigator 状态栏时代(还记得那些滚动状态栏吗)。当数组被设置为字符串时,状态只能输出为字符串,并且以逗号分隔(例如:var ar=['foo','bar']; alert(ar);)。

因为它将把您的数组保存为一个平面字符串。但是为什么呢? :) - Felix Kling
@FelixKling 我相信这个问题可以追溯到旧版 Navigator 状态栏的时代(还记得那些滚动的状态栏吗)。当将状态设置为字符串时,只能输出字符串——数组会被压平并用逗号分隔(例如:var ar=['foo','bar']; alert(ar))。 - vol7ron
是的,我知道。我认为你应该把这部分加入到你的回答中。 - Felix Kling

0

当你执行

status = [...];

实际上你是在写入或更好地说,修改窗口对象上的状态变量。

window.status = [...];

如果status被设置为一个新变量:var status = [...],那么这个问题就会得到解决。我知道你在上面的例子中有var status,但是如果没有它,我想到的唯一可能引起问题的方式就是这样。

更新

正如Felix Kling所述,由于变量在全局范围内定义而不是封装的,因此将面临这个问题,因为它是窗口对象上的成员变量。

我建议更改变量的名称或对其进行封装。


这是不正确的。在全局范围内,无论您使用var与否都没有关系。 - Felix Kling
他正在输入 var status。如果他在全局范围内这样做,这将无法解决他的问题。 - user229044
不,它不是jsfiddle.net/fZbes。 - brenjt
因为您没有在全局范围内运行代码:http://jsfiddle.net/ehcc5/。顺便说一下,在Firefox中似乎确实会有所不同。在Firefox中,使用`var`和不使用`var`实际上会产生不同的结果。在Chrome中没有区别。但是如果您查看OP的代码,他们确实使用了`var`,因此我们可以假设他们不使用Firefox。 - Felix Kling
是的,我现在明白你所说的全局作用域了。我不知道在定义了“var”之后,在内部和外部会有不同的工作方式。 - brenjt
显示剩余2条评论

-1

您已将“status”变量重新分配为以“d”开头的字符串(即day、dusk或dawn)。

var status = 'day';
console.log(status[0]) // d
console.log(status[1]) // a 
// etc...

字符串被视为字符数组,因此您可以使用方括号访问单个字符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接