这是引用传递还是值传递?

今天看到一个问题,引申出来另一个疑问。
第一种情况:

var x = [1, 2];
function change (data) {
    data = 3;
}
change(x);
console.log(x); //[1, 2]

第二种:

var x = [1, 2];
function change (data) {
    data[0] = 3;
    data[1] = 4;
}
change(x);
console.log(x); //[3, 4]

对比两种情况,js是怎么区分函数的参数是值传递还是引用传递?此中情况涉及到重载机制么?

阅读 2.9k
5 个回答

javascript 变量,实际是一个到对象的 binding 。

赋值只修改 binding ,不修改对象。

但是 a.b = 会修改 a 绑定的对象的 b 属性的 binding ,于是改变了 a 绑定的对象(因为它的一个属性变化了。

js函数传参全部都是值传递!

对于原始类型,存放在栈内存中,变量传递赋值的时候是值传递,这个没什么好说的

对于对象(object,arr,function等)来说,存放在堆内存中,变量的值其在堆内存中的地址,函数传参的时候,对于这类数据,传递的是地址的值,也是按值传递。函数内的变量和函数外的变量都是存放同一个对象在堆内存的地址,都可以改变其属性数据。

image.png

我觉得理解为传值就好了吧。
常量是存的就是他本身的值,1、'string'
对象存的是引用地址。

JavaScript 只有按值传递,没有按引用传递。

要区别也是说值传递传递的值类型还是引用类型。


var obj = { id: 0 };
var func = (o) => {
    o = { id: 1 }; 
}

func(obj);
console.log(obj.id); // 给形参重新赋值后打印出来 1 了才是引用传递

你的理解有问题,不过我当年也犯过类似的问题(好像现在还在我博客上)。其实问题的核心在于,怎么理解函数里的 data = 3

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题