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

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

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是怎么区分函数的参数是值传递还是引用传递?此中情况涉及到重载机制么?

阅读 641
评论
    5 个回答
    • 9k

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

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

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

      • 12.3k

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

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

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

        • 15.5k

        image.png

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

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

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


          var obj = { id: 0 };
          var func = (o) => {
              o = { id: 1 }; 
          }
          
          func(obj);
          console.log(obj.id); // 给形参重新赋值后打印出来 1 了才是引用传递

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

              撰写回答

              登录后参与交流、获取后续更新提醒