Javascript变量复制或引用

时间:2015-01-18 21:20:28

标签: javascript variables reference

Noob在这里。我有一个例子,其中两个变量指向内存中的相同位置(更改第二个更改第一个)。我可以对第二个变量进行操作,这将改变第一个变量。但是如果我尝试不同的操作,那么变量的值就不再相同了,这意味着,我想,变量现在指向它们在内存中的位置。

  var arr1 = "john".split('');
  console.log(arr1);
  var arr2 = arr1;
  console.log(arr2 === arr1);
  arr1 = arr2.reverse(); //changes both arr1 and arr2 --meaning they are       pointing to the same object
  console.log(arr2 === arr1); //returns true
  arr1 = arr2.slice(3);//only changes arr1--meaning they are not pointing to the same object ???
  console.log(arr2 === arr1); //returns false

这是为什么?如何更改arr2的值并始终使其效果为arr1?

2 个答案:

答案 0 :(得分:1)

简短的回答是,某些数组函数会修改数组"就位#34;但是其他函数会返回一个全新的数组,而不会更改原始数组。你只需要了解哪些是哪个。

一个非常快速的无处不在的清单:

concat()slice()join()map()filter()reduce()slice()返回新数组,原来没变。

push()pop()shift()unshift()reverse()修改了他们使用过的数组。

任何体面的参考站点(例如developer.mozilla.org)都会明确该函数是否更改了原始数组。

在您的具体示例中,值得一提的是slice(0)将复制整个数组,在这种情况下,arr1和arr2将比较相等,即使arr1现在是arr2的副本而不是引用它

答案 1 :(得分:1)

但是,如果你总是希望这两个对象指向同一个东西,那么以某种方式包装它们。例如,如果上面的代码是这样编写的,它将始终有效。

var arr1 = {arr: "john".split('')};
console.log(arr1.arr);
var arr2 = arr1;
console.log(arr2.arr === arr1.arr);
arr1.arr = arr2.arr.reverse();
console.log(arr2.arr === arr1.arr); //returns true
arr1.arr = arr2.arr.slice(3);
console.log(arr2.arr === arr1.arr); //returns true

这与JavaScript中的“指针”非常接近,无论对象的类型如何都可以使用。