• 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是一个隐式声明。

     

    原作者:微米博客

    如若引用 请注明出处

  • 相关阅读:
    关于vue的一些总结
    mvc中html导出成word下载-简单粗暴方式
    获取ip地址及城市信息
    .net中html转pdf
    div+css布局的问题
    js面向对象总结
    ES5&&ES6
    前端问题总结
    在vue的项目中引入swiper插件
    vue脚手架的使用
  • 原文地址:https://www.cnblogs.com/xiaoerlang/p/3316208.html
Copyright © 2020-2023  润新知