我注意到了以下一段代码:
> (123[45] = 67) == 67
<- true
> 123[45]
<- undefined
您也可以在浏览器中尝试。
我不明白发生了什么。
123[45]
在第一个赋值指令中被视为数组,并且实际上正确地响应下一个测试== 67
。但是,当我尝试访问内存位置时,123[45]
我变得未定义。
什么?
基元值不能具有属性(这就是它们与对象的区别)。另请参阅字符串不是对象,那么为什么它们有属性?,为什么我不能在javascript中向字符串对象添加属性?以及 Number 对象持有属性并增加数字时此代码中发生了什么?关于这个问题。
它实际上正确地响应了下一个测试
== 67
。
不是酒店访问,没有。只是赋值表达式的计算结果始终为其右侧值,而不管赋值目标会发生什么。
您也可以在实际对象上尝试:
var x = {
get p() { console.log("getting"); return 42; },
set p(val) { console.log("setting "+val); }
};
x.p = 2; // setting 2
console.log(x.p); // getting 42
console.log((x.p = 67) == 67); // setting 67 true - no "getting"!
console.log(x.p); // still: getting 42