JavaScript 值传递和引用传递 (初理解)

JavaScript 值传递和引用传递

1.1 概念

按值传递 & 按引用传递
按值传递(call by value)是最常用的求值策略:函数的形参是被调用时所传实参的副本。修改形参的值并不会影响实参。

按引用传递(call by reference)时,函数的形参接收实参的隐式引用,而不再是副本。这意味着函数形参的值如果被修改,实参也会被修改。同时两者指向相同的值。

2.实践使用

2.1 基本类型操作

    //对基本数据类型操作 按值传递
    var a = 10;
    var a_copy = a;

    a_copy = 100;
    console.log('a:'+a); //10
    console.log('a_copy:'+a_copy);//100

2.2对数组元素的操作 (注意是元素,不是对数组对象的操作)

//扩展 对数组元素的操作 引用传递
    var arr = [1,2,3];
    var arr_copy = arr;

    arr_copy[0] = 0;
    console.log('arr:'+arr); //0,2,3
    console.log('arr_copy:'+arr_copy);//0,2,3

2.3对对象变量操作

//对对象变量操作 引用传递
    var stu1 = new student('bao',21);
    var stu1_copy = stu1;

    stu1.name = 'chen';
    console.log('stu1:'+stu1);  //chen ,21
    console.log('stu1_copy'+stu1_copy); //chen,21

以上三个都比较好理解,那么看看下面的

2.4
直接对数组对象赋值

//继续看数组 直接对数组对象操作 按值传递
    var arr = [1,2,3];
    var arr_copy = arr;

    arr_copy = [4,5,6];
    console.log('arr:'+arr);  //1,2,3
    console.log('arr_copy:'+arr_copy);//4,5,6

对对象直接操作

//对对象直接操作 按值传递
var stu1 = new student('bao',21);
    var stu1_copy = stu1;

    stu1_copy = new student('chen',21);
    console.log('stu1:'+stu1.name);  //bao ,21
    console.log('stu1_copy:'+stu1_copy.name); //chen,21

我是分割线


2.5数组方法

//数组方法  引用传递
    var arr = [1,2,3];
    var arr_copy = arr;

    arr_copy.reverse();
    console.log('arr:'+arr);  //3,2,1
    console.log('arr_copy:'+arr_copy);//3,2,1

这里需要注意 即使我们以参数的方式传递给函数

function optArr(arr){
    arr.reverse();
}
//如果在 function函数作用域中 以参数的形式传递 还是引用传递
    var arr = [1,2,3];
    var arr_copy = arr;

    optArr(arr_copy);
    console.log('arr:'+arr);  //3,2,1     console.log('arr_copy:'+arr_copy);//3,2,1

如果这种情况不是我们想要的,所以可以用数组的.contact创建一个副本再进行操作。

2.6以参数的方式对对象变量操作,还是引用传递

function optObj(obj){
    obj.name = 'chen';
}
//引用传递
    var stu1 = new student('bao',21);
    var stu1_copy = stu1;

    optObj(stu1_copy);
    console.log('stu1:'+stu1.name);  //chen ,21
    console.log('stu1_copy:'+stu1_copy.name); //chen,21

总结

是不是很明了?
1.对基本类型 和 数组/对象(包括自定义对象)操作——按值传递

2.对对象/数组的变量操作——引用传递

初步理解就这样了。感觉自己的表达能力好差啊。什么时候也能认认真真仔仔细细的写好一篇博客呢。看来自己观念还得转变!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值