zoukankan      html  css  js  c++  java
  • javascript 连续赋值(转载)

    先看一个例子

     

    ● var a = {n:1};     

    ● var b = a;

    ● a.x = a = {n:2};

    ● console.log("a.x: " + a.x); //返回值:a.x: undefined

    ● console.log("a.n: " + a.n); //返回值:a.n: 2

    ● console.log("b.x: " + b.x); //返回值:b.x: [object Object]

    ● console.log("b.n: " + b.n); //返回值:b.n: 1

     

    要点梳理

     

    ● Javascript中对象的赋值是引用传递,即变量中存储的是地址而不是值。

    ● Javascript中赋值运算符“=”的优先级是除了“,”以外最低的,并且是从右向左结合的。

    ● Javascript中运算的顺序是从左向右的。

     

    过程分析

     

    ● var a = {n:1};

    ● //变量a指向对象{n:1}

    ● var b = a;

    ● //变量b也指向了对象{n:1},这时变量a和变量b指向同一个对象(同一个内存地址)

    ● a.x = a = {n:2};

    ● //这一句等价于“a.x = (a = {n:2});”,因为等号是从右向左结合的。但又由于运算过程是从左向右的,

     

    因此该句的解析过程如下

     

    ● step1. 计算 a.x,在栈(对象的引用存储在栈中)中分配一块内存,用于保存指向堆(对象的值存储在堆中)中某处的引用,假定为 A。

    ● step2. 计算第一个等号的右边,其为第二个等号的求值结果(把变量a指向对象{n: 2},然后返回该引用)。

    ● step3. 把step2中求得的结果(指向{n:2}的引用)赋值给A。

     

    将过程抽象化之后,可以描述为

     

    ● step1. 使a.x指向{n:2}。(同时,由于b与a指向同一个对象,因此b.x也指向了{n:2})

    ● step2. 使a指向{n:2}。

     

    最后,我们再看一个例子

     

    ● function fun(){

    ●       var a = b = 5;

    ● }

    ● fun();

    ● console.log(typeof a); //返回值:undefined

    ● console.log(typeof b); //返回值:number

     

    这个很好理解,第2行“var a = b = 5;”被解析成“var a = (b = 5)”,其中a是一个显式声明,b是一个隐式声明。

     

    原作者:微米博客

    如若引用 请注明出处

  • 相关阅读:
    Java Comparator字符排序(数字、字母、中文混合排序)
    java获取文件列表,并按照目录的深度及文件名的拼音的升序排列
    dwz Esc关闭dialog 窗口
    java实现在线浏览zip文件及文件下载
    慎用ArrayList的contains方法,使用HashSet的contains方法代替
    java监控指定路径下文件及文件夹变化
    java实现八种排序算法并测试速度
    java collection.frequency方法
    Java基础知识
    java List转换为字符串并加入分隔符的一些方法总结
  • 原文地址:https://www.cnblogs.com/xiaoerlang/p/3316208.html
Copyright © 2011-2022 走看看