采取以下代码
var a = b = [];
a.push('value');
if (a === b) {
console.log('a === b'); // this will execute
}
console.log(a, b); // ["value"] ["value"]
是什么赋予了?为什么同时修改
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
当然,使用以下声明可以解决初始示例中的问题:
var a = [], b = [];
但是最初示例中的行为使我感到奇怪,尤其是它仅适用于数组操作。
如果有帮助,我正在使用Google Chrome 10.0.648.82 beta
最佳答案
您需要参考的概念。当您将变量分配给另一个指向ECMAScript中的对象([]
,new Array
,{}
,new Object
,函数等)的变量时,将传递引用。除非您创建新对象并将其分配给b
,否则a
将引用b
。
重申一下,var a = [], b = []
创建两个不同的数组。 var a = b = []
将b
分配给[]
,然后将b
分配给a
,这将拾取存储在内存中的相同对象。任何增变器方法都会使该对象变异,分配给该对象的任何变量都将引用该对象。
关于javascript - Javascript数组方法的异常行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5063053/