JavaScript参数按值传递
- ECMAScript中所有函数的参数都是按值传递
什么是按值传递呢?
- 也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。
var value = 1function 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,并不会修改原值。所以第二个和第三个例子其实都是按共享传递。
注意: 按引用传递是传递对象的引用,而按共享传递是传递对象的引用的副本!
最后,可以这样理解:
参数如果是基本数据类型可以按值传递,如果是引用类型,按照共享传递。