赋值变量意外地跟随数组的变化



我将新变量分配给数组。 修改数组后,赋值的变量意外地跟随数组的变化!

let reference = "I was sent* to Earth,* to protect you."
let orders = reference.split("*").map(s => s.toLowerCase().replace(/,|?|!|:|./g,'').trim());
let answer = orders;
console.log(orders)
console.log(answer)
// changing orders and not answer!
orders.push(orders.shift());
// the orders changes as expected but the answer (that is not changed before follows the orders changes)
console.log(orders)
console.log(answer)

let answer = orders;

您正在复制订单的引用以回答,因为它是一个数组。

这就像为同一个数组(内存块(赋予另一个名称。

This should solve your problem

let answer = orders;更改为let answer = [...orders];

let reference = "I was sent* to Earth,* to protect you."
let orders = reference.split("*").map(s => s.toLowerCase().replace(/,|?|!|:|./g,'').trim());
let answer = [...orders];
console.log(orders)
console.log(answer)
// changing orders and not answer!
orders.push(orders.shift());
// the orders changes as expected but the answer (that is not changed before follows the orders changes)
console.log(orders)
console.log(answer)

let answer = orders.slice(0)将创建数组对象的浅拷贝。 在我看来,要复制数组对象,解决方案是:

let answer = copy(orders);
// copy function
function copy(object) {
var output, value, key;
output = Array.isArray(object) ? [] : {};
for (key in object) {
value = object[key];
output[key] = (typeof value === "object") ? copy(value) : value;
}
return output;
}

您正在更改现有数组。通过执行以下操作克隆它:

let reference = "I was sent* to Earth,* to protect you."
let orders = reference.split("*").map(s => s.toLowerCase().replace(/,|?|!|:|./g,'').trim());
let answer = [...orders];
console.log(orders)
console.log(answer)
// changing orders and not answer!
orders.push(orders.shift());
// the orders changes as expected but the answer (that is not changed before follows the orders changes)
console.log(orders)
console.log(answer)

或者,如果您不使用 es6,则可以使用let answer = orders.slice(0)

这将解决您的问题。

let answer = [...orders];

最新更新