关于javascript中连等赋值那点事

番茄pan      2022-02-09     435

关键词:

天看了前端网上关于JS的题目,其中有一道题目挺有意思的。如下

1 var a = b =10;
2      (function(){
3          var a = b = 20;
4       })();
5 console.log(a);
6 console.log(b);
7 问:输出的 a = ?    b = ?

你们想到的结果是什么?

也许绝大多数人和我一样认为是2020 。然而答案是10、20,别急我们先来慢慢分析(*^__^*) 嘻嘻……,

1.首先第一行的 var a = b = 10; 就是用了连等操作符,连等操作符是从右向左的 所以类似于b = 10; a = b;或者是 a = (b = 10);这样的顺序进行从右向左的赋值的。

变量a是用var进行声明并赋值的所以是局部变量,但是b是未声明而直接进行赋值的所以是全局变量。所以使用连等操作符的时候要不会出现全局变量要不就是使用作用域链后端的变量。

2.从第二行开始使用匿名函数实现模仿块级作用于(私有作用域):在里面声明的变量会在函数结束后被销毁除非被外部所使用。第三行进行连等操作,先使用外部局部变量b,b =20; 然后又重新声明了一个变量a

这是一个跨级作用域重新声明的a和外部没有任何一点关系,你可以把它看成任何其它变量不如说var x;

  |

然后 var a = b;初始化后的 a为20.

3.第四行声明定义一个匿名函数后随即执行,私有作用域中创建的变量a在结束后随即被销毁.所以最后改变的只有外部的变量b的值.

趁热打铁,我们再来看一道类似的连等操作赋值问题. 如下

1 想想结果是多少吧?
2 var a = {n:1}; 
3 var b = a;
4 a.x = a = {n:2};
5 问:console.log(a.x);
6    console.log(b.x);

 也许有的人看到答案又疑惑的,看了上面的感觉自己掌握了,然后这道题却有出乎意料之外(⊙﹏⊙)b;

结果是,不知道有没有小伙伴答对呢.......

让我们再来分析一下

1.首先第二行声明并且使用对象字面量语法创建了一个对象,有属性n = 1;第三行声明变量b,并且把a的对象引用赋值给b。所以现在变量b和a指向的是同一个对象,即他们现在共享。

2.第四行问题来了,a.x = a = {n:2}; 先创建一个对象{n:2}并把他的引用送给变量a。因为a.x在执行前保留了对{n:1}的引用,所以给原对象增加一个属性a即对{n:2}的引用

而a现在为{n:2}并没有x的属性所以为undefined,而仍然指向原来的引用所以b.x = a;

b.x == a //true

 

也许讲的有点不太清楚,希望你们能说出你们的观点,也希望自己能对JS理解更深刻

 

关于重装系统那点事

博主今天折腾了很久(新买的笔记本),就是关于重装系统。==,算是有一点点小感悟小体会吧。 这里分享给大家:1、首先你重装系统时最应该搞清楚的的是,当前这台机器你之前有没有“折腾”过。2、这台机器是新... 查看详情

关于mybatis批处理那点事

前言最近在写爬虫的时候,需要定时的将数据爬取然后导入到数据库中(数据量有点大哦),我最开始的写法是这样的,每爬取到一条数据就立即将数据入库,IO了好多次,这样在无形之中给数据库施... 查看详情

javascript连等赋值

...efined 在弄懂这个之前,我们先普及一个知识点,就是在javascript运算符中,属性运算符的优先级高于赋值运算符的优先级。因此,a.x是先于赋值之前就进行的。就是说,a.x刚开始是undefined的,这是没错的。 接下来我们探究... 查看详情

this的那点事

...this总是搞得我们晕头转向。现在,我就简单的总结一下关于this的那点事。this在函数定义时经常是不能确定的,只有在函数执行的时候才能最终确定this的归属。this总是指向最后调用它的对象,那么怎么知道到底是谁调用的呢?其... 查看详情

关于mybatis批处理那点事(代码片段)

前言最近在写爬虫的时候,需要定时的将数据爬取然后导入到数据库中(数据量有点大哦),我最开始的写法是这样的,每爬取到一条数据就立即将数据入库,IO了好多次,这样在无形之中给数据库施... 查看详情

关于mybatis批处理那点事(代码片段)

前言最近在写爬虫的时候,需要定时的将数据爬取然后导入到数据库中(数据量有点大哦),我最开始的写法是这样的,每爬取到一条数据就立即将数据入库,IO了好多次,这样在无形之中给数据库施... 查看详情

关于java项目与web项目中lib包的那点事

一、在java项目中如何引入外部jar包:1、在我们的java项目下新建一个lib文件夹;2、将我们需要引入的jat包复制到lib文件夹下;3、选中我们lib包下的jar,右键选择BuildPath--AddtoBuildPath;4、jar成功的添加到ReferencedLibraries中。这样做... 查看详情

18关于计算机网络你需要知道的那点事

什么是计算机网络?我曾多次向大家建议,要注重计算机基础的学习,那么说到计算机基础,一定离不开如下几门课程:数据结构与算法操作系统计算机组成原理计算机网络可以说,主要就是这几门课了,那说到这几门课程中,... 查看详情

18关于计算机网络你需要知道的那点事

什么是计算机网络?我曾多次向大家建议,要注重计算机基础的学习,那么说到计算机基础,一定离不开如下几门课程:数据结构与算法操作系统计算机组成原理计算机网络可以说,主要就是这几门课了,那说到这几门课程中,... 查看详情

聊聊java中final那点事

...为静态变量与普通变量.对于final修饰的变量,不是不能被赋值,是其值不能被改变,可以理解成 查看详情

安卓安全那点事(代码片段)

...望大家见谅。Android应用的安全意义在维基百科上有一个关于计算机安全的定义:计算机安全(computersecurity)是计算机与网络领域的信息安全(informatio 查看详情

谈谈netty那点事(代码片段)

第一:JVM 第二:netty分享一下关于Java网络通讯方面的内容.下载地址:https://github.com/mldn/echoJava基础知识:BIO、NIO、AIO三者的技术实现,以及彼此之间的区别Netty:TCP程序实现为主代码的核心:Echo程序... 查看详情

关于缓存一致性协议mesistorebufferinvalidatequeue内存屏障lock指令和jmm的那点事

事情是这样的,一位读者看了我的一篇文章,不认同我文章里面的观点,于是有了下面的交流。可能是我发的那个狗头的表情,让这位读者认为我不尊重他。于是,这位读者一气之下把我删掉了,在删好友之前,还叫我回家种田... 查看详情

关于缓存一致性协议mesistorebufferinvalidatequeue内存屏障lock指令和jmm的那点事(代码片段)

前言事情是这样的,一位读者看了我的一篇文章,不认同我文章里面的观点,于是有了下面的交流。可能是我发的那个狗头的表情,让这位读者认为我不尊重他。于是,这位读者一气之下把我删掉了,在删好友之前,还叫我回家... 查看详情

luffy那点事

1虚拟环境创建2后台:Django项目创建3后台配置4数据库配置5user模块User表6前台7前台配置 查看详情

华为交换机流量监管(限速)那点事1儿

...ic-policy进行限速的方式实际使用的是双桶双速率,以下是关于双桶双速率中涉及的一些参数及说明cir指定承诺信息速率,即保证能够通过的平均速率。  整数形式,取值范围是8~4294967295,单位为kbi 查看详情

javascript连等赋值问题(这是从segmentfault转过来的一个问题)

vara={n:1};varb=a;//持有a,以回查a.x=a={n:2};alert(a.x);//-->undefinedalert(b.x);//-->{n:2}对于这段代码,大部分人的理解是这样的:========错误的理解=======对于 a.x=a={n:2},大部分人的思路应该是:先把 {n:2} 赋值给a然后再创建a.x... 查看详情

有关onsaveinstancestate()那点事

有关onSaveInstanceState()那点事我们都知道,按home键将APP压入后台时,会调用onSaveInstanceState()方法来保存当前状态,并可以在重新回到APP时恢复。最近做了一些保存和恢复Activity/Fragment状态的事,总结了一点经验教训。Activity与Fragmen... 查看详情