zoukankan      html  css  js  c++  java
  • js变量的寻址与传递

    这是一个朋友问我的问题。他说代码片段一好理解,但疑问在代码片段二 为什么不是输出一个空对象?

    代码片段如下两个: 

    code segment 1

    var obj = {};
    obj.x = 1;
    obj.y = 2;
    function test(obj) {
        obj.x = 111;
    }
    test(obj);
    console.log(obj);
    
    // result >>>>>>>>>  {x=111,y=2}

     code segment 2

    var obj = {};
    obj.x = 1;
    obj.y = 2;
    function test(obj) {
        var obj2 = {};
        obj = obj2;
    }
    test(obj);
    console.log(obj);
    
    // result >>>>>>>>>  {x=1,y=2}

    以下是我的理解

    代码片段一就不在讲述,但凡对值类型和引用类型有一定的了解的话,那这个应该是没疑问的。

    代码片段二有两个应该注意的地方:

    1.test方法内变量的寻址

    test方法内部可以取到三个变量,新定义了的对象obj2、参数obj、还有方法外的obj。这三个参数有一个特别要注意的地方是,后面两个的名字是一样的,这样在方法运行的时候一定会优先取得参数的那个obj变量。而方法外的那个obj参数实际相当于window.obj。

    2.变量的传递过程

    在调用test方法,并传入方法外的obj变量,实际相当于传入window.obj这样一个引用类型,引用类型的特点是在传递的过程中并不进行自身的值复制,而是传入地址的拷贝,也就是说代码“obj = obj2;”实际是对这个拷贝的地址的改变,因为这个地址只是个拷贝,所以这并不会改变其指向的真实对象。而代码片段1的"obj.x = 111;"这会通过obj这个地址查询到x这个属性,并对其赋值。

    有点绕,虽然能理解其中的具体含义,但是也没有好的语言来表达,有好资料的朋友欢迎回复来探讨。

    浏览器没那么聪明!
  • 相关阅读:
    谈谈一些有趣的CSS题目(十四)-- 纯 CSS 方式实现 CSS 动画的暂停与播放!
    Oracle 12c CDB PDB
    sqlplus 调试存储过程
    Oracle 存储过程A
    %notfound的理解——oracle存储过程 .
    ORA-04091: table xxx is mutating, trigger/function may not see it
    JQuery Div scrollTop ScrollHeight
    JQuery JSON Servlet
    div 移动
    HTML 三角符号
  • 原文地址:https://www.cnblogs.com/rulee/p/2663800.html
Copyright © 2011-2022 走看看