JavaScript参数按值传递

南笙酒味 提交于 2020-02-28 16:49:37

JavaScript参数按值传递

  1. ECMAScript中所有函数的参数都是按值传递
 
什么是按值传递呢?
  1. 也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。
var value = 1

function foo(value){
    value = 2
    console.log(value) // 2
}
foo(value)
console.log(value) // 1

当传递value到函数foo中,相当于拷贝了一份value,假设拷贝的这份叫_value,函数中修改的都是_value的值,而不会影响原来的value的值

引用传递?

  1. 如果值是一个复杂的数据结构,拷贝(值传递)就是产生性能影响
  2. 引用传递,就是传递对象的引用,函数内部对参数的任何改变都会影响原有对象的值,因为两者引用的是统一地址。
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,并不会修改原值。所以第二个和第三个例子其实都是按共享传递。
 
注意: 按引用传递是传递对象的引用,而按共享传递是传递对象的引用的副本!
 
最后,可以这样理解:
参数如果是基本数据类型可以按值传递,如果是引用类型,按照共享传递。
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!