JavaScript参数按值传递
-
ECMAScript中所有函数的参数都是按值传递
什么是按值传递呢?
-
也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。
var value = 1
function foo(value){
value = 2
console.log(value) // 2
}
foo(value)
console.log(value) // 1
当传递value到函数foo中,相当于拷贝了一份value,假设拷贝的这份叫_value,函数中修改的都是_value的值,而不会影响原来的value的值
引用传递?
-
如果值是一个复杂的数据结构,拷贝(值传递)就是产生性能影响
-
引用传递,就是传递对象的引用,函数内部对参数的任何改变都会影响原有对象的值,因为两者引用的是统一地址。
var obj = {
value : 1
}
function foo(obj){
obj.value=2
console.log(obj.value)// 2
}
foo(obj)
console.log(obj.value)// 2
上面说了ECMAScript中所有函数的参数都是按值传递,怎么能按引用传递成功呢
共享传递
var obj = {
value : 1
}
function foo(obj){
obj = 2
console.log(obj)// 2
}
foo(obj)
console.log(obj.value)// 1
如果JavaScript采用的是引用传递,外层的值也会被修改。
所以修改 o.value,可以通过引用找到原值,但是直接修改 o,并不会修改原值。所以第二个和第三个例子其实都是按共享传递。
注意: 按引用传递是传递对象的引用,而按共享传递是传递对象的引用的副本!
最后,可以这样理解:
参数如果是基本数据类型可以按值传递,如果是引用类型,按照共享传递。