1 基础类型参数传递
const a = 1; let b = 1; function add(num){ return num + 1 } add(a) add(b) console.log(a) // a = 1 console.log(b) // a = 1
a 、b 都没有影响
2 引用类型参数传递
const obj = { a: 1, b: 2 } function Persion(obj) { obj.a = 2 return obj } let p1 = Persion(obj) console.log(obj) // {a: 2, b: 2} console.log(p1) // {a: 2, b: 2} console.log(obj === p1) // true
在什么情况下两个对象会全等?
由此可见, 函数中 obj地址 指向的是 const 中 obj,然而这并未能说明什么。
原则上 const 的指向地址是不允许改变的,假如函数的参数是按引用传递的话,我给函数中的 obj 指向另一个对象会怎样
const obj = { a: 1, b: 2 } function Persion(obj) { obj.a = 2 obj = { a: 4, b: 4 } return obj } let p1 = Persion(obj) console.log(obj) // {a: 2, b: 2} console.log(p1) // {a: 4, b: 4} console.log(obj === p1) // false
按理应该会报错,可实际上并没有,为什么会这样?
我们可以把上面的代码理解成
const obj = { a: 1, b: 2 } function Persion(obj) {
let objs = obj; objs.a = 2 objs = { a: 4, b: 4 } return objs } let p1 = Persion(obj) console.log(obj) // {a: 2, b: 2} console.log(p1) // {a: 4, b: 4} console.log(obj === p1) // false
这里实际上是 把我们的参数 当中一个局部变量给存储了起来,其实函数中的 obj 被赋值的时候,指向的地址就开始改变了,这就说明函数中的参数并非是按 引用传递 的。