learn
learn copied to clipboard
JavaScript深入之参数按值传递
定义
在《JavaScript高级程序设计》第三版 4.1.3,讲到传递参数:
ECMAScript中所有函数的参数都是按值传递的。
什么是按值传递呢?
也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。
按值传递
var value = 1;
function foo(v) {
v = 2;
console.log(v); //2
}
foo(value);
console.log(value) // 1
引用传递
所谓按引用传递,就是传递对象的引用,函数内部对参数的任何改变都会影响该对象的值,因为两者引用的是同一个对象。
举个例子:
var obj = {
value: 1
};
function foo(o) {
o.value = 2;
console.log(o.value); //2
}
foo(obj);
console.log(obj.value) // 2
共享传递
共享传递是指,在传递对象的时候,传递对象的引用的副本。
注意: 按引用传递是传递对象的引用,而按共享传递是传递对象的引用的副本!
var obj = {
value: 1
};
function foo(o) {
o = 2;
console.log(o); //2
}
foo(obj);
console.log(obj.value) // 1
所以可以这么说:参数如果是基本类型是按值传递,如果是引用类型按共享传递。
但是因为拷贝副本也是一种值的拷贝,所以在高程中也直接认为是按值传递了。
堆栈
例子一:
var value = 1;
function foo(v) {
v = 2;
console.log(v); //2
}
foo(value);
console.log(value); // 1
内存分布如下:
改变前:
栈内存 | 堆内存 | ||
value | 1 | ||
v | 1 |
改变后:
栈内存 | 堆内存 | ||
value | 1 | ||
v | 2 |
例子二:
var obj = {
value: 1
};
function foo(o) {
o.value = 2;
console.log(o.value); //2
}
foo(obj);
console.log(obj.value); // 2
内存分布如下:
改变前:
栈内存 | 堆内存 | |
obj,o | 指针地址 | {value: 1} |
改变后:
栈内存 | 堆内存 | |
obj,o | 指针地址 | {value: 2} |
例子三:
var obj = {
value: 1
};
function foo(o) {
o = 2;
console.log(o); //2
}
foo(obj);
console.log(obj.value); // 1
内存分布如下:
改变前:
栈内存 | 堆内存 | |
obj,o | 指针地址 | {value: 1} |
改变后:
栈内存 | 堆内存 | |
obj | 指针地址 | {value: 1} |
o | 2 |
以上解释来自:sunsl516 commented on 2 Jun 2017.
原文链接:JavaScript 深入之参数按值传递