Javascript数组方法的意外行为

Javascript数组方法的意外行为,javascript,Javascript,以下面的代码为例 var a = b = []; a.push('value'); if (a === b) { console.log('a === b'); // this will execute } console.log(a, b); // ["value"] ["value"] 有什么好处?为什么a和b都要修改?作出b声明的var是a的实时副本吗?如果是这样的话,那么为什么同样的情况不能适用于正则变量赋值,例如: var a = b = ''; a = 'value';

以下面的代码为例

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

console.log(a, b); // ["value"] ["value"]
有什么好处?为什么
a
b
都要修改?作出
b
声明的
var
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版,它不是一个实时副本,而是一个引用同一实例的对象

当您运行
[]
时,您正在执行
new Array()
,因此,您正在将新的
Array
实例分配给
a
b


祝你好运

您需要研究的概念是引用。当您将一个变量分配给另一个变量,该变量指向ECMAScript中的对象(
[]
新数组
{}
新对象
,函数等),则传递引用<除非您创建新对象并将其分配给
b
,否则code>b将引用
a

重申一下,
var a=[],b=[]
创建了两个不同的数组
var a=b=[]
b
赋值给
[]
,然后将
b
赋值给
a
,后者拾取存储在内存中的相同对象。任何mutator方法都会对该对象进行变异,分配给该对象的任何变量都会引用该对象。

当您在变量中存储“对象”(包括数组)时,您真正存储的是对该对象的引用(或“指针”),而不是对象本身的副本。也就是说,对象存在于内存中的某个地方,变量中存储的是一条信息,告诉解释器在哪里找到该对象

相反,数字或布尔等基本体实际上存储在变量中

所以在我最好的ASCII艺术中,当你有了代码

var y = [];
…你最终会得到这样的结果:

+−−−−−−−−−−+ | y | +−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−+ | Ref55467 |−−−−−−−−−−−>| The actual array | +−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−+ | [] | +−−−−−−−−−−−−−−−−−−+ …你最终会:

+−−−−−−−−−−+ | x | +−−−−−−−−−−+ | 32 | +−−−−−−−−−−+ 看起来是这样的:

+−−−−−−−−−−+ | a | +−−−−−−−−−−+ | Ref55467 |−−−−−−+ +−−−−−−−−−−+ | | +−−−−−−−−−−−−−−−−−−+ +−−−−>| The actual array | | +−−−−−−−−−−−−−−−−−−+ +−−−−−−−−−−+ | | [] | | b | | +−−−−−−−−−−−−−−−−−−+ +−−−−−−−−−−+ | | Ref55467 |−−−−−−+ +−−−−−−−−−−+ …看起来像:

+−−−−−−−−−−+ | a | +−−−−−−−−−−+ | 32 | +−−−−−−−−−−+ +−−−−−−−−−−+ | b | +−−−−−−−−−−+ | 32 | +−−−−−−−−−−+
当我们调用
foo
时,我们传递了对数组对象的引用,因此当
foo
使用该引用修改数组时,我们可以看到结果。

“将b分配给[],然后将a分配给b”应该是“将[]分配给b,然后将b分配给a”。 +−−−−−−−−−−+ | a | +−−−−−−−−−−+ | Ref55467 |−−−−−−+ +−−−−−−−−−−+ | | +−−−−−−−−−−−−−−−−−−+ +−−−−>| The actual array | | +−−−−−−−−−−−−−−−−−−+ +−−−−−−−−−−+ | | [] | | b | | +−−−−−−−−−−−−−−−−−−+ +−−−−−−−−−−+ | | Ref55467 |−−−−−−+ +−−−−−−−−−−+
var a = b = 32;
+−−−−−−−−−−+ | a | +−−−−−−−−−−+ | 32 | +−−−−−−−−−−+ +−−−−−−−−−−+ | b | +−−−−−−−−−−+ | 32 | +−−−−−−−−−−+
function foo(theArray) {
    theArray[0] = 1;
}

var a = ["one", "two", "three"];
foo(a);
alert(a[0]); // alerts "1"