数组赋值是否会创建新引用

时间:2017-06-06 18:44:23

标签: javascript

我遇到以下情况。我正在初始化一个数组,并将其分配给对象的属性。

var arr = [1,2,3,4,5];
var obj = { 'numbers': arr };

我知道我将对数组arr的引用传递给了我的对象obj。所以我可以做到以下几点:

arr.push(6);
console.log(obj);

将按预期显示以下内容:

{ numbers: [ 1, 2, 3, 4, 5, 6] }

现在是意想不到的部分。 arr的值通过外部事件发生更改,我希望obj.numbers的值同时更改。但事实并非如此:

arr = [0,0,0,0,0];
console.log(arr);
console.log(obj);
arr --> [0,0,0,0,0]
obj --> { numbers: [ 1, 2, 3, 4, 5, 6] }

因此我的arr变量的值已更改,但numbers变量中的obj属性未更改。

所以,我唯一的解释是,只要对数组执行赋值,就会中断旧引用并创建新引用。是这样吗?

我如何将新值[0,0,0,0,0]分配给arr变量和obj.numbers(同时)?

4 个答案:

答案 0 :(得分:2)

是的,=的作业会创建一个新参考并删除旧参考。为了解决这个问题:

  var arr = [1, 2, 3, 4, 5];
  var obj = { 'numbers': arr };
  console.log(arr === obj.numbers); // -> true

  arr.length = 0;
  var newArr = [0, 0, 0, 0, 0];
  arr.push(...newArr);
  console.log(arr === obj.numbers); // -> true
  console.log(arr); // -> [0, 0, 0, 0, 0]

设置长度等于0将清除阵列。将项目推送到数组时,它不会创建新数组,因此您会看到arrobj都发生更改。

答案 1 :(得分:1)

您也可以将Array#splice用于新阵列。

var array = [1,2,3,4,5],
    object = { numbers: array },
    newArray = [41, 42, 43];

[].splice.apply(array, [0, array.length].concat(newArray));

console.log(object);

答案 2 :(得分:0)

我还没有找到关于此的确切文档,但经过一些实验,我得出结论,一项任务确实创造了一个新的参考。

这是我最终解决这个问题的方法。

arr.splice(0);
[0,0,0,0,0].map(el => arr.push(el);

这给了我以下预期结果。

console.log(arr);
console.log(obj);
arr --> [0,0,0,0,0]
obj --> { numbers: [0,0,0,0,0] }

顺便说一下,对象也是如此,这是合乎逻辑的,因为数组是一种对象。

答案 3 :(得分:0)

它运作正常。变量是保存引用的位置。您保存在 services.AddMvc() .AddMvcOptions(options => options.ModelMetadataDetailsProviders.Add(new CustomMetadataProvider ())); 另一个参考文献中。

您可以使用此代码更新第一个数组。

arr

arr.length = 0; arr.push(...[0, 0, 0, 0, 0]); 方法无法帮助您,因为它会返回数组的新副本。