按值传递和按引用传递

2016-03-27  本文已影响180人  Binaryify

按值传递 VS. 按引用传递

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

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

按引用传递会使函数调用的追踪更加困难,有时也会引起一些微妙的BUG。

按值传递由于每次都需要克隆副本,对一些复杂类型,性能较低。两种传值方式都有各自的问题。

例子:

按值传递

function change(num){
  // 这里对num这个变量创建了一个内存的副本
  var num=num+1;
  return num;
}
var num=1;
console.log("内部的",change(num)); //2
console.log("外部的",num);  //1

按引用传递

var obj={
  name:"xiaoming"
}
function change2(obj){
//当前obj对内存的这个地址指向同一个
  obj.age=20;
  console.log("内部的",obj)
}
change(obj)
console.log("外部的",obj)
//内部的{name:"xiaoming,age:20}
//外部的{name:"xiaoming,age:20}

按引用传递:object,array(js对象)
按值传递:string,number,boolean

上一篇下一篇

猜你喜欢

热点阅读