zoukankan      html  css  js  c++  java
  • javascript深入参数传递

    我们都知道javascript的基础数据类型有: UndefinedNullBooleanNumberString
    如果从一个变量向另一个变量复制基本类型的值,会在变量对象上创建一个新值,然后把值复制到为新变量分配的位置上。

    • code
    var num1 = 1;
    var num2 = num1; // 1
    num2 = 5; // 5 
    console.log(num1) // 1
    

    此后,这两个变量可以参与任何操作而不会相互影响。

    • 函数传参有有区别吗?
    var a = 5
    
    function b(num) {
        num = 4
        return num
    }
    b(a); //4
    a; //5
    
    • 注意这只是基本数据类型, 如果改成引用类型会怎么样?
    var p1 = {
        name: "Tom"
    }
    
    function b(obj) {
        obj.name = "Jerry"
        return obj
    }
    b(p1) // { name : "Jerry"}
    p1.name // Jerry
    
    栈内存 堆内存
    p1, obj 指针地址 { name :"Tom" }
     obj.name = "Jerry"
    

    obj修改了堆内存里的name值, p1还是指向那个地址. 所以p1跟着变了.

    • 这样会怎么样?
    var p1 = {
        name: "Tom"
    }
    
    function b(obj) {
        obj.name = "Jerry"
        obj = {}
        obj.name = "Jack"
        return obj
    }
    b(p1) // { name : "Jack"}
    p1; // { name: "Jerry" }
    

    看到结果按照上面的意思应该p1也是{ name : "Jack"}但是为什么不同呢?

    1 . 先修改了共同指向的堆内存里的name值

    • 第一步
    栈内存 堆内存
    p1, obj 指针地址 { name :"Tom" }
    • 第二步
    栈内存 堆内存
    p1, obj 指针地址 { name :"Jerry" }

    2 . obj重新赋值引用类型,其实就是改变了obj的指针,并没有改变p1的指针指向的地址里的值

    • 第三步
    栈内存 堆内存
    p1 指针地址 { name :"Jerry" }
    obj 指针地址 { }
    • 第四步
    栈内存 堆内存
    p1 指针地址 { name :"Jerry" }
    obj 指针地址 { name: "Jack" }
  • 相关阅读:
    ubuntu 下安装Angular2-cli脚手架
    git的使用及常用命令(二)
    framework7+node+mongo项目
    LINUX下安装搭建nodejs及创建nodejs-express-mongoose项目
    初学strurs基础
    JAVA Struts2 搭建
    mongodb的基本操作
    LightOj_1342 Aladdin and the Magical Sticks
    Codeforces Round #Pi (Div. 2)
    Codeforces Round #315 (Div. 2)
  • 原文地址:https://www.cnblogs.com/kongyijilafumi/p/14087067.html
Copyright © 2011-2022 走看看