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

  • 相关阅读:
    TPS限流
    JDK并发基础与部分源码解读
    tomcat6-servlet规范对接 与 ClassLoader隔离
    tomcat6-输入输出buffer设计
    tomcat6-endpoint设计
    springMVC请求路径 与实际资源路径关系
    mysql 常用的数据类型
    认识IPv4分组
    CSMA/CD协议(载波侦听多路访问/碰撞检测) 最小帧长理解
    简单的vector--- 2
  • 原文地址:https://www.cnblogs.com/fczbk/p/13649037.html
Copyright © 2020-2023  润新知