【问题标题】:Javascript beginner - function modifiing global const [duplicate]Javascript初学者-修改全局常量的函数[重复]
【发布时间】:2021-11-10 10:33:35
【问题描述】:

我目前正在学习 js,偶然发现了这对我来说很奇怪的行为。我可能在这里遗漏了一些基本的东西,但我找不到答案。

我有一个修改数组并返回它的函数。如果我打印出原始数组会被修改,即使它是一个常量。

const arr = [5, 9, 7, 1, 8, ];

function test(arr) {
  const strings = ['qwe', 'asd'];
  arr.splice(1, 0, ...strings);
  return arr
}

console.log(test(arr))
console.log(arr)
console.log(test(arr))
console.log(arr)
console.log(test(arr))
console.log(arr)

输出显示原始数组每次都变大。我期待它每次都是相同的输出。

【问题讨论】:

  • const arr 表示标识符arr 无法重新分配;这并不意味着您不能改变arr 引用的对象(数组)。 arr 的重新分配和实际数组的突变是两件不同的事情。 const 与重新分配有关。
  • 请注意,函数中的arr 与您在全局范围内定义的arr 变量不同,函数参数为函数创建局部变量。如果你在函数中使用arr = 1,那将起作用(全局arr 不会改变)。
  • const 创建一个不可变的绑定,而不是一个不可变的值。 Google 查找更多相关帖子:Keyword 'const' does not make the value immutable. What does it mean?JavaScript ES6 const a = {} is mutable. Why?

标签: javascript arrays function constants


【解决方案1】:

一个 const 意味着你不能像这样重新分配给它

const arr = [1, 2, 3];
arr = [5, 4]; // You cannot do this that's const

除此之外你可以修改数组内容

【讨论】:

  • 谢谢,这很有道理。但我仍然不明白为什么 log() 中的函数调用正在写入更改全局 arr。函数上下文中的 arr 不应该在另一个范围内吗?如果我重命名函数变量,我会得到相同的结果
  • 那是因为当你传递数组甚至对象(数组也是对象)时,你传递的是对它的引用(它的内存位置)而不是一个新副本,所以你在函数中所做的任何事情都会影响同一个数组被使用
  • 关于它的更多理论,谷歌'stack vs heap'。这是许多(流行)语言的共同点。
  • 如果有人关心,我发现了问题:正如杰克所说,这是因为我将它作为一个对象引用。我用 let neWarri = [...arr] 将它复制到一个新对象
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-15
  • 1970-01-01
  • 1970-01-01
  • 2020-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多