JavaScript是按引用传递还是按值传递?

5

JavaScript语言是按值传递还是按引用传递的?

对于基本类型和对象类型是否有区别?

3个回答

9
它实际上使用一种称为共享调用的评估策略。
所有类型都是按值传递的。没有按引用传递,否则您将能够修改在函数调用站点声明的变量的内容。通常人们说在JS中对象是按引用传递的。实际上它们是按共享传递的,这意味着您可以修改对象的属性,并且这些更改将对那些持有该对象引用的人可见,但引用本身是不可修改的。

3
这句话的意思是,你拿到了一个指向某个物体的指针,然后可以在当前范围内修改该物体的属性,但如果你试图在内部重新分配该物体的值,实际上只是重置了你的指针。 - Norguard

4

对象是按引用传递的,而原始值是按值传递的。

注意,原始值包括以下内容:

  • 数字
  • 字符串
  • 布尔值
  • undefined
  • null

您可以在MDN关于函数的页面中找到更多详细信息。


JavaScript 中的所有内容都是按值传递的。只是当您传递一个对象时,您传递的是对象的引用而不是对象本身,因此传递的是引用的副本。即使您分享的 MDN 链接也说明了这一点。 - Scott Marcus

0

除了原始类型,其他所有类型都是按引用传递的。
在JavaScript中,几乎所有东西都是对象。 正如Sirko所说,对象是按引用传递的。

因此,无论您是在谈论附加到变量的根对象,还是在谈论一个对象的属性/方法,链式3点深度,或者您正在谈论数组中的对象,作为对象的属性,在对象数组中...


JavaScript 中的所有内容都是按值传递的。只是当您传递一个对象时,您传递的是该对象引用的副本(按值传递),而不是对象本身,因此传递的是引用的副本。 - Scott Marcus
我并不困惑。从技术上讲,我知道这里没有区别。那些问这些问题的人往往处于早期阶段,并从教授所有内容都是从C构建起来的或者从C的视角看待的人那里学到了这些术语。JS没有指针的概念,因此将指针的副本传递给那些从Scratch或Haskell等语言转入JS的人是没有意义的(除了C交互模块)。即使过了十年,我也不会建议他们学习Rust的借用检查器或C++的移动语义,即使这样做在严谨性上是正确的。 - Norguard
我的假设是,他们在听到年轻的Java开发人员使用这些问题后,选择了它们,这些开发人员从某个开发人员(或教师)那里学习了ASM(大概是MIPS)和C / C ++(大概是pre auto,constexpr,lambda和device independent values),因此感觉这个问题实际上与使用语言编写良好或惯用代码有关(我发现这更像ML,其中问题是无意义的)。他们要么真正询问可变性,要么询问ECMA-262规范关于调用语义。作为一名教师,你会怀疑哪一个? - Norguard
此外,教师的工作是直觉学生提问背后的意义,并帮助他们在符合他们水平的同时理解知识,并鼓励他们朝着更安全/更有成效的方向进行进一步探索,还是重复技术性的机械式讲解,直到他们理解为止?我可以告诉你,我幼儿园时期的量子物理学习并不顺利。 - Norguard
很难相信你没有困惑,因为你的帖子非常明确地陈述了“对象通过引用传递,而基元通过值传递。”这是错误的。然后你又说“我知道从技术上讲没有区分”,这只会让读者更加困惑。 - Scott Marcus
显示剩余30条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接