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.复制构造函数和重载赋值操作符 ...
随机推荐
- 藏地传奇js
http://zd.163.com/m/zhenyan/ js很厉害,有很多值得学习的地方,记录下来. http://res.nie.netease.com/zdcq/qt/13/0625_zheny ...
- 第三方控件netadvantage UltraWebGrid如何生成多级跨行表头个人总结
1.生成多级表头,横向和纵向跨度. 1>对于有字段的的表头合并:也就是(工期.项目经理信息除外)可以在前台通过spanx和spany属性控制.对于空字段(工资.项目经理必须通过后台动态添加),而 ...
- CSS绘制无图片的气泡对话框
<div class="qipao_contianer"> <div class="qipao_content yj3" ...
- 在线试听功能(前端直接略过吧,适合javaEE后台开发的)
应用场景:录音试听,MP3试听... 比如为客户提供录音功能时.客户希望录音完成试听录音,然后下载等功能.直接上代码:关键是取得录音的在服务器的地址,如:url='http://localhost:8 ...
- GridView动态增加行
GridView动态增加行GridView动态增加行 很多时候,我们需要可编辑的表格,来比较方便的进行数据的录入,比如学习成绩的录入.当然这就要求能够动态的增加行,来一次性录入多个学生的信息.现在用A ...
- 【xcode插件介绍】Alcatraz ----The package manager for Xcode
对于许多iOS开发者而言,Alcatraz并不陌生,甚至是相当的喜闻乐见.Alcatraz是一款开源的Xcode包管理器,由Marin Usalj.Delisa Mason和Jurre Stender ...
- HTTP报文格式详解
HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的.HTTP有两类报文:请求报文和响应报文. HTTP请求报文 一个HTTP请求报文由请求行(request ...
- GNU Make 学习系列一:怎样写一个简单的Makefile
编程通常遵循一个相当简单的程序:编辑源文件,编译源代码成可执行的格式,调试结果.尽管将源代码翻译成可执行程序是常规的过程,如果做的不正确,程序员可能会浪费大量的时间去追踪问题.大多数的开发者都经历过这 ...
- Windbg找出死锁
使用Windbg找出死锁,解决生产环境中运行的软件不响应请求的问题 前言 本文介绍本人的一次使用Windbg分析dump文件找出死锁的过程,并重点介绍如何确定线程所等待的锁及判断是否出现了死锁. 对于 ...
- 最长递增子序列(Longest Increase Subsequence)
问题 给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱).例如:给定一个长度为6的数组A{5, 6, 7, 1, 2, 8},则其最长的单调递增子序列为{5,6,7,8 ...