我遇到以下情况。我正在初始化一个数组,并将其分配给对象的属性。
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
(同时)?
答案 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将清除阵列。将项目推送到数组时,它不会创建新数组,因此您会看到arr
和obj
都发生更改。
答案 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]);
方法无法帮助您,因为它会返回数组的新副本。