在创建基于小型计数器的游戏时,我有一个这样的数组:
var status = ["day","dusk","night","dawn"];
如果我试图访问数组的第一个索引,我会得到:
console.log(status[0]); //yields "d"
@monners提到它可能是一个保留字,所以我将变量名改为xstatus
,它运行良好。
我的问题是:为什么status[0]
只会返回第一个索引的第一个字母?
答案 0 :(得分:6)
您正在修改无法设置为数组的window.status
:
https://developer.mozilla.org/en-US/docs/Web/API/Window.status
Firefox中存在一些无法解释的行为。虽然全局范围内的status
和var status
都提供对window.status
属性的引用,但var status
不会展平数组:
status = ["meagar"];
console.log(window.status[0]); // 'm'
VS
var status = ["meagar"];
console.log(window.status[0]); // 'meagar'
答案 1 :(得分:2)
因为它会将数组保存为扁平字符串,而d
是字符串的第一个字符(位置0
)。
我相信这可以追溯到旧的Navigator状态栏日期(记住那些自动收报机状态栏)。状态只能输出为字符串---数组,当设置为字符串时,将被展平并以逗号分隔(例如var ar=['foo','bar']; alert(ar);
)
答案 2 :(得分:0)
当你这样做时
status = [...];
您实际上是在编写或更好地说明,修改窗口对象上的状态变量。
window.status = [...];
如果将status
设置为新变量:var status = [...]
,那么这将解决问题。我知道你上面的例子中有var
状态但没有它是我能想到的唯一可能导致问题的方法。
<强>更新强>
正如Felix Kling所述,在全局范围内定义而未封装的变量将面临此问题,因为它是窗口对象上的成员变量。
我建议更改变量的名称,或将其封装。
答案 3 :(得分:-1)
您已将'status'变量重新指定为以'd'开头的字符串(即白天,黄昏或黎明)。
var status = 'day';
console.log(status[0]) // d
console.log(status[1]) // a
// etc...
字符串被视为字符数组,因此您可以使用括号访问各个字符。