函数的参数都是按值传递的

232 阅读1分钟

ECMAScript中所有函数的参数都是按值传递的

也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。基本类型的传递如同基本类型的复制一样,而引用类型值的传递,如同引用类型变量的复制一样。

总结

很简单,javascript函数参数都是按值传递(都是栈内数据的拷贝)。

基本类型传的是值本身(因为直接把值存在栈内),引用类型传的是对象在内存里面的地址 (因为复杂对象存在堆内,所以在栈里存对象所在的堆地址)。

基本类型参数的传递与基本类型的复制一样,传递的是变量值。

function addTen(num) {
  num = num + 10;
  return num;
}
var count = 20;
var result = addTen(count);
console.log(count); // 20
console.log(result); // 30

引用类型参数的传递与引用类型的复制一样,传递的是内存地址。

function changeObjProperty(o) {
  o.siteUrl = "http://www.baidu.com";
  console.log(o);
  o = new Object();
  o.siteUrl = "http://www.google.com";
  console.log(o);
}
let webSite = new Object();
changeObjProperty(webSite);
console.log(webSite.siteUrl);

//结果:
//{siteUrl: 'http://www.baidu.com'}
//{siteUrl: 'http://www.google.com'}
//http://www.baidu.com

对象作为参数,传递进去的是这个对象的引用地址,O.siteUrl是给这个对象赋值; o = new Object,把o指向另一个对象,o.siteUrl是给这个新对象赋值,不影响webSite这个变量指向的那个对象, 两个o指向的对象的引用地址不同