Javascript赋值语句中的“&&”操作符和"||"操作符
有这么一种常见的语句:
var a = a || 4;
那赋值语句中的“&&”操作符和"||"操作符是什么意思?如何知道这两个逻辑操作符两旁的数据哪个会被赋值到等号左边的变量里面?其实,会被赋值到等号左边的变量里面的一定是起决定性因素的那个变量。其实这就是if...else的变种,要么a=a,要么a=4。虽然没那么直接,不过也省了不少代码。
什么是起决定性因素的变量?
我们知道,两个bool型变量a和b进行与操作,只有a和b的值都为true时,返回结果才为true,只要有一个变量值为false,返回结果就为false。看下这个语句:
c = a && b
所以,把上面这个语句的Boolean()方法去掉,把a和b换成任意类型的变量,结果就很明显了。假设a为true,那么此时还无法决定c为true还是false,要看b的值才能决定,所以此时b是决定性因素;假设a为false,那么此时已经可以确定c为false,不用考虑b的值了,所以此时a是决定性因素。
或操作的原理和与操作类似,这里不再说明。
现在看下文章开头提到的那个语句,意思就是说如果a已经赋值(假设a是不为0的数),那么a的值不变,否则a=4。再往细了说,就是如果a已经赋值,那么Boolean(a)=true,或操作符右边的数就不看了,等式左边的a就等于右边的a;如果a没有复制,由于a已经声明,那么等式右边的a=undefined,Boolean(a)= false,这时看操作符右边,不管操作符右边的Bool值为什么,现在等式左边的a就等于这个数了。
需要注意的是, 如果一个变量为声明,打印这个变量时,系统会报错;如果声明了一个变量但没有复制,打印这个变量时,系统会打印出‘undefined’这个字符串。因此,在与/或操作中,如果起决定性因素的那个变量没有声明,那么系统是会报错的。
实际应用中,或操作符会更常用些。一般用于插件替换原始值(参见Swiper.js),或者是DOM操作,例如:
var length = length || $list.length
如果这个语句会执行多次,那么从第二次开始,每次执行这个语句时,就不会再去遍历这个数组的长度了,因为长度已经存在length变量里面了。
。
Javascript赋值语句中的“&&”操作符和"||"操作符的更多相关文章
- 【JavaScript】JavaScript赋值语句中的逻辑与&&和逻辑或||
在其他语言中,我们往往看到逻辑符号出现在判断语句当中,如 if(a||b){} 但在一些js相关的面试题或者书中,我们有时会看到逻辑与&&和逻辑或||符号出现在赋值语句或者返回语句中, ...
- 第一百节,JavaScript表达式中的运算符
JavaScript表达式中的运算符 学习要点: 1.什么是表达式 2.一元运算符 3.算术运算符 4.关系运算符 5.逻辑运算符 6.*位运算符 7.赋值运算符 8.其他运算符 9.运算符优先级 E ...
- JavaScript 语言中的 this
JavaScript 语言中的 this 由于其运行期绑定的特性,JavaScript 中的 this 含义要丰富得多,它可以是全局对象.当前对象或者任意对象,这完全取决于函数的调用方式.JavaSc ...
- javascript数组中数字和非数字下标的区别(转)
http://blog.csdn.net/qq_27461663/article/details/52014911 考完试后闲来无事,想起好多天没写js了,于是打算实践一下最近看到的一些好玩的点子.结 ...
- javascript变量中基本类型和引用类型的详解解读
前言: Javascript语言中的变量和其他语言的变量有很大区别,javascript松散类型的本质,决定了它只是在特定时间时间保存特定值得名字而已.由于不存在定义某个变量必须保存何种数据类型值的规 ...
- JS规则 我或你都可以 (逻辑或操作符)||逻辑或操作符,相当于生活中的“或者”,当两个条件中有任一个条件满足,“逻辑或”的运算结果就为“真”
我或你都可以 (逻辑或操作符) "||"逻辑或操作符,相当于生活中的"或者",当两个条件中有任一个条件满足,"逻辑或"的运算结果就为&quo ...
- JavaScript jQuery 中定义数组与操作及jquery数组操作
首先给大家介绍javascript jquery中定义数组与操作的相关知识,具体内容如下所示: 1.认识数组 数组就是某类数据的集合,数据类型可以是整型.字符串.甚至是对象Javascript不支持多 ...
- JavaScript文件中调用AngularJS内部方法或改变$scope变量
需要在其他JavaScript文件中调用AngularJS内部方法或改变$scope变量,同时还要保持双向数据绑定: 首先获取AngularJS application: 方法一:通过controll ...
- C++中复制构造函数与重载赋值操作符总结
前言 这篇文章将对C++中复制构造函数和重载赋值操作符进行总结,包括以下内容: 1.复制构造函数和重载赋值操作符的定义: 2.复制构造函数和重载赋值操作符的调用时机: 3.复制构造函数和重载赋值操作符 ...
随机推荐
- WebIM(2)---消息缓存
WebIM系列文章 在一步一步打造WebIM(1)一文中,已经介绍了如何实现一个简单的WebIM,但是,这个WebIM有一个问题,就是每一次添加消息监听器时,都必须访问一次数据库去查询是否有消息,显然 ...
- 通过SqlClr制作Sql自动化批量执行脚本
原文:通过SqlClr制作Sql自动化批量执行脚本 通过SqlClr制作Sql自动化批量执行脚本 在与同事一起做项目时,看到同事用sqlclr做批量执行脚本,感觉挺新奇的就上网搜集资料自己模仿跟做了个 ...
- 我的Android 4 学习系列之数据库和Content Provider
目录 创建数据库和使用SQLite 使用Content Provider.Cusor和Content Value来存储.共享和使用应用程序数据 使用Cursor Loader异步查询Content P ...
- Mysql插入内容过长(Packet for query is too large)
原文:Mysql插入内容过长(Packet for query is too large) 这个以前一直没有碰到过,一次性向Mysql数据库插入内容过长的话会出现这个问题,解决办法就是在Mysql配置 ...
- IEnumerable<T>转换为IList<SelectListItem>
扩展方法IEnumerable<T>转换为IList<SelectListItem> ,提供@Html.DropDownList使用 由于在MVC中经常会使用到@Html. ...
- MobileProbe的使用
MobileProbe是CNZZ移动这块统计的一个产品,目前似乎分成了基础版和专业版.下载地址为: http://m.cnzz.com/?a=main&m=download&f=inf ...
- 一键部署mono 免费空间
一键部署mono 免费空间支持c# 再也不担心伙食费换空间了 一直以来 部署mono 都是很头疼的事情 因为是我在是不熟悉非win环境,今天偶然发现这个项目,挺好的,分享下 https://githu ...
- 总结windows多线程同步互斥
windows多线程同步互斥--总结 我的windows多线程系列文章: windows多线程--原子操作 windows多线程同步--事件 windows多线程同步--互斥量 windows多线程同 ...
- 10.25最后的模拟赛DAY1 answer
QAQ太困了,大概说一下自己的思路: 其实这题很容易看错题目或是想错,就比如我个傻逼,一开始以为p+q一定等于n.... 咳咳...其实这题不用想太多,我们可以通过这n个字符串一个个假设正确或是不正确 ...
- 什么是Numpy的ndarray
什么是Numpy的ndarray 首先,Numpy的核心是ndarray. 然后,ndarray本质是数组,其不同于一般的数组,或者Python 的list的地方在于它可以有N 维(dimention ...