javascript基础:函数传参方式

先分析以下逻辑输入什么:

let a = {
      name:'a',
      age:12
}
function change(o){
      o.age = 18
      o = {
        name:'b',
        age:49
      }
      return o
}
let b = change(a)
console.log(a.age)//18
console.log(b.age)//49

涉及内容:

1.按值传递(call by value),按引用传递(call by reference),按共享传递(call by sharing)

(1)按值传递(call by value)是最常用的求值策略:函数的形参是被调用时所传实参的副本。修改形参的值并不会影响实参。

(2)按引用传递(call by reference),函数的形参接收实参的隐式引用,而不再是副本。这意味着函数形参的值如果被修改,实参也会被修改。同时两者指向相同的值。

(3)对象类型按共享传递的(call by sharing,也叫按对象传递、按对象共享传递),是JS中的对象类型传递方式(该求值策略被用于Python、Java、Ruby)。

该策略的重点是:调用函数传参时,函数接受对象实参引用的副本(既不是按值传递的对象副本,也不是按引用传递的隐式引用)。

它和按引用传递的不同在于:在共享传递中对函数形参的赋值,不会影响实参的值。

2.深克隆和浅克隆

总结: 值传递不会被修改;对象传递,本身不会被修改,但属性值可以被修改且只能通过属性修改。