为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

呼啦一阵风 2019-05-21 14:51:56
原始类型(Number,String等)按值传递,但是对象是未知的,因为它们可以是值传递(如果我们认为持有对象的变量实际上是对象的引用)并且通过引用传递(当我们认为对象的变量保存对象本身时)。虽然最后并不重要,但我想知道提交传递约定的参数的正确方法是什么。是否有JavaScript规范的摘录,它定义了与此相关的语义?JavaScript是一种传递引用还是按值传递的语言?
查看完整描述

4 回答

?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

它在Javascript中很有趣。考虑这个例子:


function changeStuff(a, b, c)

{

  a = a * 10;

  b.item = "changed";

  c = {item: "changed"};

}


var num = 10;

var obj1 = {item: "unchanged"};

var obj2 = {item: "unchanged"};


changeStuff(num, obj1, obj2);


console.log(num);

console.log(obj1.item);    

console.log(obj2.item);

这会产生输出:


10

changed

unchanged

  • 如果它是纯值传递值,那么更改obj1.item将对obj1函数外部没有影响。

  • 如果它是纯粹的参考传递,那么一切都会改变。num100,并obj2.item会读"changed"

相反,情况是传入的项目是按值传递的。但是通过值传递的项本身就是一个引用。从技术上讲,这称为分享呼叫

实际上,这意味着如果您更改参数本身(与num和一样obj2),则不会影响输入参数的项目。但是如果你更改参数的INTERNALS,它将传播回来(如同obj1)。


查看完整回答
反对 回复 2019-05-21
?
慕容3067478

TA贡献1773条经验 获得超3个赞

变量不“保持”对象,它保存一个引用。您可以将该引用分配给另一个变量,现在它们都引用同一个对象。它总是按值传递(即使该值是参考值......)。

没有办法改变作为参数传递的变量所持有的值,如果JS支持通过引用传递,这将是可能的。


查看完整回答
反对 回复 2019-05-21
  • 4 回答
  • 0 关注
  • 500 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信