将同一数组对象分配给多个变量?

时间:2020-06-03 14:45:30

标签: javascript node.js

据我了解,当将一个数组对象分配给一个新变量时,可以在两个变量之间“引用”该数组对象,但是它们的值本身可以被任何一个分配的变量诱变。

至少看起来是这样。

let variable1 = [6, 3, 2, 6, 7, 2, 9, 1, 5];
let variable2 = variable1;

for (i = 0; i < 10; i++) {
    variable2.unshift(i);
}

console.log(variable1);
> [9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 6, 3, 2, 6, 7, 2, 9, 1, 5]

我只能在运行时给定时间标记数据状态的时间戳,方法是创建一个新数组并放入前一个数组的内容,或者是否使用了另一种做法?谢谢。

3 个答案:

答案 0 :(得分:2)

Array.from()

const array2 = Array.from(array1)
console.log(array2)

答案 1 :(得分:1)

如果您不希望这种行为,则必须确保使用在原始数组的每个变异上生成新数组的方法。

要复制数组,可以使用Array.from(array)或ES6 [...array]

有了这些知识:对于array.unshift(e),您可以使用ES6 array = [...array, e]

let variable1 = [6, 3, 2, 6, 7, 2, 9, 1, 5];
let variable2 = variable1;

for (i = 0; i < 10; i++) {
    variable2 = [...variable2, i];
}

console.log('var2', variable1);
console.log('var1', variable2);

答案 2 :(得分:1)

JavaScript通常总是按值传递,但是在变量引用对象(包括数组)的情况下,“值”是对该对象的引用

更改变量的值时,它不会更改基础对象或基元-而是将变量指向新值。

但是,更改对象(包括数组)的属性将更改基础对象本身。

tl; dr

如果没有完整的状态副本,则无法在给定的时间点捕获状态。

如何创建副本

根据数据的结构,可以使用多种方法来创建数据的克隆。

如果它只是一个原始数组,例如一个数字/字符串数组,该数组的shallow copy就足够了:

const arr = [1,2,3,"foo"];

// using array spread
const clone1  = [...arr];

// Array.from()
const clone2 = Array.from(arr);

// mapping the array
const clone3 = arr.map(e => e);

// push with spread
const clone4 = [];
clone4.push(...arr);

// good old for loop
const clone5 = [];
for(let i = 0; i < arr.length; i++)
  clone5.push(arr[i]);

如果您的深层数据结构包含嵌套的对象/数组,则需要递归进行浅层复制以实现深层复制。

但是,已经有许多好的库可以为您处理这些库,例如lodash

const value = [{a: 1}, {b: 2}, {c: ["a", "b"]}];

// using lodash _.cloneDeep to get a deep copy
const clone = _.cloneDeep(value);
相关问题