Javascript表达式中连续的 && 和 || 之赋值区别


Posted in Javascript onOctober 17, 2010

代码如下:

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);

来看看输出结果就会明白了:

关于 ‘&&'的输出结果为:

4 
4 
0 
you 
0 
false 
23 
1 
undefined 
1 
null

每一行的编号对应上面的每一个 test。

关于 ‘||'的输出结果为:

1 
2 
0 
2 
hate 
ihateyou 
true 
undefined 
true 
null 
true

仔细对照着看的话就会清楚一些了:

多个连续的 && 的表达式中若没有 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 相关文章推荐
js类的静态属性和实例属性的理解
Oct 01 Javascript
JS性能优化笔记搜索整理
Aug 21 Javascript
javascript模块化是什么及其优缺点介绍
Sep 02 Javascript
script不刷新页面的联动前后代码
Sep 18 Javascript
javascript正则匹配汉字、数字、字母、下划线
Apr 10 Javascript
jQuery判断指定id的对象是否存在的方法
May 22 Javascript
在JavaScript中访问字符串的子串
Jul 07 Javascript
第五篇Bootstrap 排版
Jun 21 Javascript
使用Node.js给图片加水印的方法
Nov 15 Javascript
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
Dec 14 Javascript
JS仿Base.js实现的继承示例
Apr 07 Javascript
一个简易的js图片轮播效果
Jul 22 Javascript
Javascript读取cookie函数代码
Oct 16 #Javascript
JavaScript 拾碎[三] 使用className属性
Oct 16 #Javascript
javascript使用eval或者new Function进行语法检查
Oct 16 #Javascript
自己整理的一个javascript日期处理函数
Oct 16 #Javascript
理解Javascript_10_对象模型
Oct 16 #Javascript
理解Javascript_09_Function与Object
Oct 16 #Javascript
理解Javascript_08_函数对象
Oct 15 #Javascript
You might like
连接到txt文本的超链接,不直接打开而是点击后下载的处理方法
2009/07/01 PHP
ThinkPHP3.0略缩图不能保存到子目录的解决方法
2012/09/30 PHP
深入解析PHP内存管理之谁动了我的内存
2013/06/20 PHP
php实现仿写CodeIgniter的购物车类
2015/07/29 PHP
PHP文件上传类实例详解
2016/04/08 PHP
php版微信公众号接口实现发红包的方法
2016/10/14 PHP
详解PHP5.6.30与Apache2.4.x配置
2017/06/02 PHP
jQuery提交多个表单的小例子
2013/06/30 Javascript
关于javascript event flow 的一个bug详解
2013/09/17 Javascript
nodejs之请求路由概述
2014/07/05 NodeJs
JavaScript通过代码调用Flash显示的方法
2016/02/02 Javascript
node.js学习之交互式解释器REPL详解
2016/12/08 Javascript
bootstrapValidator表单验证插件学习
2016/12/30 Javascript
jQuery实现动态添加、删除按钮及input输入框的方法
2017/04/27 jQuery
angular过滤器实现排序功能
2017/06/27 Javascript
详谈for循环里面的break和continue语句
2017/07/20 Javascript
JS实现的input选择图片本地预览功能示例
2018/08/29 Javascript
vue3.0+vue-router+element-plus初实践
2020/12/02 Vue.js
[04:09]2014DOTA2国际邀请赛Ti西雅图 历届冠军相继出局 BBC综述今日比赛
2014/07/20 DOTA
[03:34]2014DOTA2西雅图国际邀请赛 淘汰赛7月15日TOPPLAY
2014/07/15 DOTA
Python3 修改默认环境的方法
2019/02/16 Python
对pyqt5中QTabWidget的相关操作详解
2019/06/21 Python
python文件读写代码实例
2019/10/21 Python
tensorflow使用指定gpu的方法
2020/02/04 Python
python实现人脸签到系统
2020/04/13 Python
用HTML5制作视频拼图的教程
2015/05/13 HTML / CSS
Rossignol金鸡美国官网:始于1907年法国百年雪具品牌
2019/03/06 全球购物
高中毕业生自我鉴定范文
2013/09/26 职场文书
优秀共产党员先进事迹
2014/01/27 职场文书
《花的勇气》教后反思
2014/02/12 职场文书
幼儿园大班见习报告
2014/10/31 职场文书
受资助学生感谢信
2015/01/21 职场文书
辩护意见书
2015/06/04 职场文书
银行求职信怎么写
2019/06/20 职场文书
浅谈Redis在直播场景的实践方案
2021/04/27 Redis
解读Vue组件注册方式
2021/05/15 Vue.js