2 回答
TA贡献1820条经验 获得超2个赞
这是关于分配在脚本中的工作方式。给定以下代码:
const a = { foo: "bar" };
const b = a;
变量和两者都指向同一对象。这意味着内存中只有一个对象,当您尝试使用对象访问对象时,将反映对象指向的可变,反之亦然。例如:abab
const a = { foo: "bar" };
const b = a;
a.foo = "baz";
console.log(a);
console.log(b);
展开代码段
那么现在,我们如何使这种情况不会发生呢?为此,我们可以将 的浅副本分配给 。这可以通过几种不同的方式完成,下面使用传播运算符(...):ab
const a = { foo: "bar" };
const b = { ...a };
a.foo = "baz";
console.log(a);
console.log(b);
展开代码段
所以现在,内存中有两个不同的对象。你会注意到我称之为浅层复制,这很重要:如果你有深层对象,你需要深度复制才能完成同样的解耦。
如何在您的特定情况下解决此问题:
针对您的特定情况的 TLDR 是,您的临时变量应该是数组的浅副本,而不是对现有数组的引用:
let temp = [...seq];
TA贡献1827条经验 获得超4个赞
我在下面解释原因:
对于字符串和数字,javascript 似乎是按值传递的,而数组等对象是按引用传递的。
这意味着在你的第一个例子中;该函数正在获取对原始数组的引用,当您这样做时,temp实际上只是一个指向传入的原始对象的指针。在这种情况下,当您修改温度时,情况就是这样;它实际上是在修改字母表。let temp = seq
alphabet
按值传递只是将值发送到函数,因此原始变量与数字示例中的变量相同。
为了获得预期的结果,您需要制作数组的深度副本,例如 .let temp = deepCopy(seq)
我认为使用可能只是用户知道不要修改它的语法,一些编辑器不会让你在代码中重新修改const,但在这种情况下,它以迂回的方式发生。const
添加回答
举报