如果我在Chrome控制台中声明以下内容:
var object = {0:0, 1:1}
我可以调用object [0]和object [1]并获取它们的值。我也可以调用object [“0”]和object [“1”]。接下来,如果我声明:
var object = {"0":0, "1":1}
我也可以进行以上四种调用。但如果我宣布:
var object = {a:0, 1:1}
当我调用object [a]时,我得到一个“a is not defined”的ReferenceError,但是对象[“a”]返回0,即使声明中的属性名不是字符串。我猜JavaScript认为我正在调用第一个例子中不存在的变量。但为什么调用对象[0]和对象[“0”]都有效?似乎JavaScript正在对数字进行某种自动转换(可能因为它们不能是变量名称),但是这有什么规则?并且这种行为是普遍存在于其他可能出现的位置还是仅仅是对象的括号表示法?
答案 0 :(得分:0)
ReferenceError
获得object[a]
的原因是因为文字a
是javascript中的变量。 "a"
是一个包含字母a。
您可以使用点符号object.a
或括号表示法object["a"]
object.a; //=> 0
object["a"]; //=> 0
object[1]; //=> 1
object["1"]; //=> 1
或者您可以使用变量进行访问
var x = "a";
object[x]; //=> 0
var y = 1;
object[y]; //=> 1
答案 1 :(得分:0)
使用括号时,将评估括号中的 表达式。表达式的价值是什么
a
??好吧,如果“a”不是声明的变量,那就是废话。使用.
表示法时,操作符后面的标识符(以及必须是标识符)将被视为字符串。这就是语言运作的方式。
答案 2 :(得分:0)
你是对的。
a
引擎假设有一个令牌是变量。
如果输入"a"
,JS知道它是一个字符串原语
如果输入0
,JS知道它是一个数字原语。
因此,在obj.a
,obj["a"]
,obj[0]
,obj["0"]
之上,您还可以说:
var a = 0;
obj[a]; // 0
您的应用爆炸式增长,因为a
尚未定义,现在您想要使用它。
是的,这是预期的行为 括号内的东西不被视为对象的“部分” - 它是一种说“给我这个键所引用的对象的值”的方式,其中键可能是数字或字符串(或者可以强制成字符串或数字的东西。)
将来,使用地图和弱图,您实际上也可以使用其他对象/功能作为键。
var obj = new Map(),
func = function () { },
el = document.getElementById("myId");
obj[func] = 1;
obj[el] = 2;
现在,这些东西在技术上有用......但只是因为它们被转换为它们的字符串值......所以如果你有两个写成相同的函数(但技术上是两个不同的对象) ),你当前会覆盖价值 在地图内部,它们将被视为单独的对象。
现在使用DOM元素更糟糕,因为存储数百个元素并将引用绑定到它们可能很有用,这样你就不必继续寻找它们......但是现在,你需要为每一个创建一个唯一的ID号/密钥,并存储它,并记住密钥,然后创建一个子对象来保存你想要的数据......
将来,通过地图,您可以说:
var my_els = document.querySelector(".lots-of-els");
for (let el of my_els /* also the future */) {
console.log( my_map_of_data[el].info );
}