使用Javascript数组方法的意外行为

Sal*_*man 0 javascript

请使用以下代码

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)

是什么赋予了?为什么要ab修改?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测试版

med*_*iev 6

你需要理解的概念是引用.当分配变量到另一个指向的对象([],new Array,{},new Object,函数,等等)中的ECMAScript,参考被传递.除非您创建新对象并将其分配给b,a否则将引用b.

重申一下,var a = [], b = []创建两个不同的数组.var a = b = []分配b[],然后ba其拾取存储在存储器中完全相同的对象.任何mutator方法都会改变该对象,并且分配给该对象的任何变量都将引用该对象.