采取以下代码

var a = b = [];
a.push('value');
if (a === b) {
    console.log('a === b'); // this will execute
}

console.log(a, b); // ["value"] ["value"]


是什么赋予了?为什么同时修改abvar声明是否使ba的实时副本?如果是这样,那么为什么相同的规则不能适用于常规变量分配,例如:

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/

10-12 12:27
查看更多