关于JavaScript中连等赋值那点事
今天看了前端网上关于JS的题目,其中有一道题目挺有意思的。如下
var a = b =10;
(function(){
var a = b = 20;
})();
console.log(a);
console.log(b);
问:输出的 a = ? b = ?
你们想到的结果是什么?
也许绝大多数人和我一样认为是、20 。然而答案是10、20,别急我们先来慢慢分析(*^__^*) 嘻嘻……,
.首先第一行的 var a = b = 10; 就是用了连等操作符,连等操作符是从右向左的 所以类似于b = 10; a = b;或者是 a = (b = 10);这样的顺序进行从右向左的赋值的。
变量a是用var进行声明并赋值的所以是局部变量,但是b是未声明而直接进行赋值的所以是全局变量。所以使用连等操作符的时候要不会出现全局变量要不就是使用作用域链后端的变量。
.从第二行开始使用匿名函数实现模仿块级作用于(私有作用域):在里面声明的变量会在函数结束后被销毁除非被外部所使用。第三行进行连等操作,先使用外部局部变量b,b =20; 然后又重新声明了一个变量a
这是一个跨级作用域重新声明的a和外部没有任何一点关系,你可以把它看成任何其它变量不如说var x;
|
然后 var a = b;初始化后的 a为20.
.第四行声明定义一个匿名函数后随即执行,私有作用域中创建的变量a在结束后随即被销毁.所以最后改变的只有外部的变量b的值.
趁热打铁,我们再来看一道类似的连等操作赋值问题. 如下
想想结果是多少吧?
var a = {n:1};
var b = a;
a.x = a = {n:2};
问:console.log(a.x);
console.log(b.x);
也许有的人看到答案又疑惑的,看了上面的感觉自己掌握了,然后这道题却有出乎意料之外(⊙﹏⊙)b;
结果是
,不知道有没有小伙伴答对呢.......
让我们再来分析一下
.首先第二行声明并且使用对象字面量语法创建了一个对象,有属性n = 1;第三行声明变量b,并且把a的对象引用赋值给b。所以现在变量b和a指向的是同一个对象,即他们现在共享。
.第四行问题来了,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理解更深刻
关于JavaScript中连等赋值那点事的更多相关文章
- JavaScript中对象与函数的某些事[JavaScript语言精粹-N1]
今天在读<JavaScript语言精粹>的时候,关于函数的一个部分,始终觉得有点难以理解,代码如下: 1: var obj = (function(){ 2: var value = 0; ...
- JavaScript中,关于new的那些事
这篇文章是自己对new学习过程中的一些理解,有不对的地方希望指出,接受组织的批评教育. 导火线,前段时间学习jQuery的时候,看到源码中有这样一段: jQuery = function(select ...
- JavaScript中=、==、===以及!=、!==的区别与联系
JavaScript中=.==.===以及!=.!==的区别与联系 在JavaScript中,“=”代表赋值操作:“==”先转换类型再比较,“===”先判断类型,如果不是同一类型直接为false. ...
- JavaScript中创建类,赋值给ajax中的data参数
缘由:因为要给根据是否选中checkbox来动态增加ajax中data的属性(ajax的data属性格式的几种方法,参考http://www.jb51.net/article/46676.htm) d ...
- ajax实现给JavaScript中全局变量赋值(转)
原文地址:ajax实现给JavaScript中全局变量赋值 问题简化: <script type="text/javascript"> var a=1 ; functi ...
- javascript中函数声明、变量声明以及变量赋值之间的关系与影响
javascript中函数声明.变量声明以及变量赋值之间的关系与影响 函数声明.变量声明以及变量赋值之间有以下几点共识: 1.所有的全局变量都是window的属性 2.函数声明被提升到范围作用域的顶端 ...
- javascript中的this与函数讲解
前言 javascript中没有块级作用域(es6以前),javascript中作用域分为函数作用域和全局作用域.并且,大家可以认为全局作用域其实就是Window函数的函数作用域,我们编写的js代码, ...
- JavaScript 中的数据类型
Javascript中的数据类型有以下几种情况: 基本类型:string,number,boolean 特殊类型:undefined,null 引用类型:Object,Function,Date,Ar ...
- javascript中的操作符详解1
好久没有写点什么了,根据博主的技术,仍然写一点javascript新手入门文章,接下来我们一起来探讨javascript的操作符. 一.前言 javascript中有许多操作符,但是许多初学者并不理解 ...
随机推荐
- Centos更换yum源
Centos更换yum源 步骤如下: 备份原始源 cd /etc/yum.repos.d/ mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/ ...
- BZOJ 1009 :[HNOI2008]GT考试(KPM算法+dp+矩阵快速幂)
这道到是不用看题解,不过太经典了,早就被剧透一脸了 这道题很像ac自动机上的dp(其实就是) 然后注意到n很大,节点很小,于是就可以用矩阵快速幂优化了 时间复杂度为o(m^3 *log n); 蒟蒻k ...
- JavaScript 基本类型值-Number类型
▓▓▓▓▓▓ 大致介绍 在JavaScript的内部采用IEEE754格式来表示数字,所以不区分整数和浮点数,都是用64位浮点数的形式储存.就是说,在JavaScript内部,就根本没有小数.但是有些 ...
- configparser配置文件模块
1.configparser的作用 mysql等很多文件的配置如下: [DEFAULT]ServerAliveInterval = 45Compression = yesCompressionLeve ...
- c++ STL常用算法使用方法
#include <string> #include <vector> #include <functional> #include <iostream> ...
- 不用搭环境的10分钟AngularJS指令简易入门01(含例子)
不用搭环境的10分钟AngularJS指令简易入门01(含例子) `#不用搭环境系列AngularJS教程01,前端新手也可以轻松入坑~阅读本文大概需要10分钟~` AngularJS的指令是一大特色 ...
- 最简单的 RabbitMQ 监控方法 - 每天5分钟玩转 OpenStack(158)
这是 OpenStack 实施经验分享系列的第 8 篇. 先来看张图:这是 Nova 的架构图,我们可以看到有两个组件处于架构的中心位置:数据库和Queue.数据库保存状态信息,而几乎所有的 nova ...
- 【2017-02-24】循环嵌套、跳转语句、异常语句、迭代穷举、while
一.循环嵌套 1.格式 for() { for() { } } 2.执行顺序 先执行外边循环进到循环体发现里面的循环,开始执行里面的循环.等到里面的循环执行完毕,再执行外边的循环. 在外面循环第一次, ...
- Day01 Java环境变量配置
1. Java环境配置的确浪费了一些时间,网上找的资料在设置PATH.CLASSPATH几乎都是利用的JAVA_HOME的路径 例如CLASSPATH=.;%JAVA_HOME%\lib;%JAVA_ ...
- 向php提交数据及json
php中提交表单有两种方法,即: (1)利用表单提交 例: <form action="php文件名" method='提交方式'> username:<inpu ...