关于 js 函数参数值传递的理解

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 被赋值的时候,指向的地址就开始改变了,这就说明函数中的参数并非是按 引用传递 的。

原文地址:https://www.cnblogs.com/fczbk/p/13649037.html