请使用以下代码
var a = b = [];
a.push('value');
if (a === b) {
console.log('a === b'); // this will execute
}
console.log(a, b); // ["value"] ["value"]
Run Code Online (Sandbox Code Playgroud)
是什么赋予了?为什么要a和b修改?var声明是否正在制作b实时副本a?如果是这样,那么为什么不能同样适用于常规变量赋值,例如:
var a = b = '';
a = 'value';
if (a === b) {
console.log('a === b'); // this will never run
}
console.log(a, b); // value
Run Code Online (Sandbox Code Playgroud)
当然,使用以下声明解决了初始示例中的问题:
var a = [], b = [];
Run Code Online (Sandbox Code Playgroud)
但是初始示例中的行为让我觉得奇怪,特别是它只适用于数组操作.
如果有帮助,我正在使用Google Chrome 10.0.648.82测试版
你需要理解的概念是引用.当分配变量到另一个指向的对象([],new Array,{},new Object,函数,等等)中的ECMAScript,参考被传递.除非您创建新对象并将其分配给b,a否则将引用b.
重申一下,var a = [], b = []创建两个不同的数组.var a = b = []分配b到[],然后b到a其拾取存储在存储器中完全相同的对象.任何mutator方法都会改变该对象,并且分配给该对象的任何变量都将引用该对象.