Javascript 表达式中连续的 && 和 || 之赋值区别
为了区分赋值表达式中出现的连续的 ‘&&’和 ‘||’的不同的赋值含义,做了一个小测试,代码如下:
function write(msg){ for(var i = 0; i < arguments.length; i ++){ document.write(arguments[i] + '<br />'); }}//关于 '&&'test1 = 1 && 2 && 3 && 4;test2 = '0' && 2 && 3 && 4;test3 = 1 && 2 && 0 && 4;test4 = 2 && 'i' &&'love' && 3 && 'you';test5 = 'i' &&'hate' && 1 && 0 && 'you';test6 = 1 && false &&'ihateyou' &&'2';test7 = 2 && true &&'ihatehateyou' &&'23';test8 = 4 && true &&'undefined' &&'true' &&'1';test9 = 4 && true && undefined && 'true' &&'1';test10 = 4 && true &&'null' &&'true' &&'1';test11 = 4 && true &&null &&'true' &&'1';write(test1, test2, test3, test4, test5, test6, test7, test8, test9, test10, test11);write('----------------------------------------------');//关于 '||'_test1 = 1 || 2 || 3 || 4;_test2 = 0 || 2 || 3 || 4;_test3 = 0 || '0' || 8 || 4;_test4 = 2 || 'i' ||'love' || 0 || 'you';_test5 = 0 || 'hate' || 1 || 0 || 'you';_test6 = false || 0 || 'ihateyou' ||'2';_test7 = false ||true ||'ihatehateyou' ||'23';_test8 = 0 || 0 || 'undefined' ||'true' ||'1';_test9 = 0 || 0|| undefined || 'true' ||'1';_test10 = 0 || false ||'null' ||'true' ||'1';_test11 = 0 || 0 || null ||'true' ||'1';write(_test1, _test2, _test3, _test4, _test5, _test6, _test7, _test8, _test9, _test10, _test11); |
来看看输出结果就会明白了:
关于 ‘&&’的输出结果为:
|
1
2
3
4
5
6
7
8
9
10
11
|
440you0false231undefined1null |
每一行的编号对应上面的每一个 test。
关于 ‘||’的输出结果为:
|
1
2
3
4
5
6
7
8
9
10
11
|
1202hateihateyoutrueundefinedtruenulltrue |
仔细对照着看的话就会清楚一些了:
多个连续的 && 的表达式中若没有 0, false, undefined, null 的话,它将取得最后一个“子表达式”的值,否则将表达式中的 0, false, undefined, null 返回。
多个连续的 || 的表达式将会取第一个“子表达式”的值,若为 0, false, undefined, null 中之一的话则取下一个“子表达式”的值,以此类推,直至找到不为 0, false, undefined, null 的“子表达式”,并将它作为整个表达式的值。
补充:
上面的似乎没有考虑一种情况,就是有一个子表达式为 '' 怎么办呢?其实可以再换一种表述方式来描述 && 和 || 的工作方式:
对于 (...) && (...) && (...) ...
从左至右遍历各个子表达式,并将每个子表达式进行 Boolean 的强制转换,若出现 Boolean(子表达式) 为 false 的情况,则整个表达式的值即为此子表达式的值(0 或 false 或 undefined 或 null 或 ''),后面的子表达式不再判断;若所有的 Boolean(子表达式) 均为 true,则整个表达式的值即为最后一个子表达式的值。
对于 (...) || (...) || (...) ...
从左至右遍历各个子表达式,并将每个子表达式进行 Boolean 的强制转换,若出现 Boolean(子表达式) 为 true 的情况,则整个表达式的值即为此子表达式的值,后面的子表达式不再“理会”;若 Boolean(子表达式) 为 false,则判断后一个子表达式的 Boolean 情况,直至找到 Boolean(子表达式) 为 true 的情况;若全部的 Boolean(子表达式) 均为 false,则返回最后一个子表达式的值(0 或 false 或 undefined 或 null 或 '')。
这里要注意:
Boolean(false) != Boolean('false'),前者为 false,而后者为 true 。
Boolean(undefined) != Boolean('undefined'),前者为 false,而后者为 true 。
Boolean(null) != Boolean('null'),前者为 false,而后者为 true 。
Boolean(0) != Boolean('0'),前者为 false,而后者为 true 。
Boolean('') == false
Javascript 表达式中连续的 && 和 || 之赋值区别的更多相关文章
- 第一百节,JavaScript表达式中的运算符
JavaScript表达式中的运算符 学习要点: 1.什么是表达式 2.一元运算符 3.算术运算符 4.关系运算符 5.逻辑运算符 6.*位运算符 7.赋值运算符 8.其他运算符 9.运算符优先级 E ...
- JavaScript ES6中export及export default的区别
相信很多人都使用过export.export default.import,然而它们到底有什么区别呢? 在JavaScript ES6中,export与export default均可用于导出常量.函 ...
- JavaScript ES6中export及export default的区别以及import的用法
本文原创地址链接:http://blog.csdn.net/zhou_xiao_cheng/article/details/52759632,未经博主允许不得转载. 相信很多人都使用过export.e ...
- EL表达式中,param和requestScope的区别
在看param和requestScope之前,不妨先了解下在java下request的情况: 1. request对象通常用来接收客户端提交到服务端的数据,如:在servlet或者action中可以用 ...
- 试议常用Javascript 类库中 throttle 与 debounce 辅助函数的区别
问题的引出 看过我前面两篇博客的童鞋可能会注意到都谈到了事件处理的优化问题. 在很多应用中,我们需要控制函数执行的频率, 例如 窗口的 resize,窗口的 scroll 等操作,事件触发的频率非常高 ...
- JavaScript表达式--掌握最全的表达式,一切尽在掌握中,让表达不再是难事
一.JavaScript表达式: 算术表达式: 字符串表达式: 关系(比较)表达式: 逻辑表达式 二.JavaScript运算符: ●什么是表达式--表达式是产生一个结果值的式子,常量,变量,运算符. ...
- 006——VUE中的内容与属性中使用javascript表达式的方法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 好客租房13-在jsx中使用javascript表达式
嵌入js表达式 数据存储在js中 语法{javascript表达式} 注意语法中是单大括号 不是双大括号 //导入react import React from "react&quo ...
- JavaScript 面试中常见算法问题详解
1.阐述下 JavaScript 中的变量提升 所谓提升,顾名思义即是 JavaScript 会将所有的声明提升到当前作用域的顶部.这也就意味着我们可以在某个变量声明前就使用该变量,不过虽然 Java ...
随机推荐
- cafe-ssd數據集訓練
训练方式::https://blog.csdn.net/xiao_lxl/article/details/79106837 caffe-ssd训练自己的数据集 https://blog.csdn.ne ...
- vue接口交互写死的
vue接口 写死的 RoleOfUserOrgRef: function ({ commit }, param) { return new Promise((resolve) => { $axi ...
- 系统学习python第四天学习笔记
1.解释 / 编译补充 编译型:代码写完后,编译器将其变成成另外一个文件,然后交给计算机执行. 解释型:写完代码交给解释器,解释器会从上到下一行行代码执行:边解释边执行. [实时翻译] 2.字符串功能 ...
- 设x,y是概率空间(Ω,F,P)上的拟可积随机变量,证明:X=Y a.e 当且仅当 xdp = ydp 对每个A∈F成立。Q: X=Y almost surely iff ∀A∈G∫AXdP=∫AYdP
E{XE{Y|C}}=E{YE{X|C}} 现在有没有适合大学生用的搜题软件呢? https://www.zhihu.com/question/51935291/answer/514312093 ...
- Python笔记_第四篇_高阶编程_进程、线程、协程_2.线程
1. 线程概述: 在一个进程的内部,要同时干多件事情,就需要同时运行“多个子任务”,我们把进程内的这些“子任务”叫做线程.也就说线程是进程成的子任务. 线程通常叫做情景的进程.线程是通过向内侧控件的并 ...
- priority_queue(优先队列)的用法(包括pbds)
置顶!!! 有时候在定义的时候,不要把两个<>连在一起写,以免被编译器错误理解!!!! 头文件 #include <queue> queue的一般用法不再叙述 类型名 prio ...
- LaunchPad(思维)
链接:https://ac.nowcoder.com/acm/contest/3665/D来源:牛客网 题目描述 Hery is a boy with strong practical abiliti ...
- Java连接MySQL Warning: Establishing SSL connection without server's identity verification is not recommended
1. 数据库 1.1 创建表 在当前数据库students中,创建数据表student: mysql> create table student( ),#学生ID ),#学生姓名 -> a ...
- 【转】Rendering Problems The following classes could not be instantiated
xml 设计时警告 打开es/values/目录下styles.xml文件. 把:<style name="AppTheme" parent="Theme.AppC ...
- c#学习笔记01——引用&类
数据类型 值类型 bool 布尔值 True 或 False False byte 8 位无符号整数 0 到 255 0 char 16 位 Unicode 字符 U +0000 到 U +ffff ...