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.对对象/数组的变量操作——引用传递
初步理解就这样了。感觉自己的表达能力好差啊。什么时候也能认认真真仔仔细细的写好一篇博客呢。看来自己观念还得转变!