据我了解,当将一个数组对象分配给一个新变量时,可以在两个变量之间“引用”该数组对象,但是它们的值本身可以被任何一个分配的变量诱变。
至少看起来是这样。
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]
我只能在运行时给定时间标记数据状态的时间戳,方法是创建一个新数组并放入前一个数组的内容,或者是否使用了另一种做法?谢谢。
答案 0 :(得分:2)
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通常总是按值传递,但是在变量引用对象(包括数组)的情况下,“值”是对该对象的引用
更改变量的值时,它不会更改基础对象或基元-而是将变量指向新值。
但是,更改对象(包括数组)的属性将更改基础对象本身。
如果没有完整的状态副本,则无法在给定的时间点捕获状态。
根据数据的结构,可以使用多种方法来创建数据的克隆。
如果它只是一个原始数组,例如一个数字/字符串数组,该数组的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);