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 相关文章推荐
Javascript面向对象扩展库代码分享
Mar 27 Javascript
js切换光标示例代码
Oct 10 Javascript
原生JS可拖动弹窗效果实例代码
Nov 09 Javascript
javascript浏览器兼容教程之事件处理
Jun 09 Javascript
Bootstrap实现导航栏的2种方式
Nov 28 Javascript
js实现移动端微信页面禁止字体放大
Feb 16 Javascript
phantomjs导出html到pdf的方法总结
Oct 19 Javascript
AngularJS实现动态切换样式的方法分析
Jun 26 Javascript
详解如何使用webpack打包多页jquery项目
Feb 01 jQuery
使用localStorage替代cookie做本地存储
Sep 25 Javascript
js实现带搜索功能的下拉框
Jan 11 Javascript
Vite和Vue CLI的优劣
Jan 30 Vue.js
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
如何使用PHP对网站验证码进行破解
2015/09/17 PHP
php 数组随机取值的简单实例
2016/05/23 PHP
PHP实现简易计算器功能
2020/08/28 PHP
兼容ie和firefox js关闭代码
2008/12/11 Javascript
javascript div 弹出可拖动窗口
2009/02/26 Javascript
面向对象的编程思想在javascript中的运用上部
2009/11/20 Javascript
js jquery分别实现动态的文件上传操作按钮的添加和删除
2014/01/13 Javascript
JavaScript动态提示输入框输入字数的方法
2015/07/27 Javascript
浅析AMD CMD CommonJS规范--javascript模块化加载学习心得总结
2016/03/16 Javascript
react-native 完整实现登录功能的示例代码
2017/09/11 Javascript
使用JS实现气泡跟随鼠标移动的动画效果
2017/09/16 Javascript
使用原生js封装的ajax实例(兼容jsonp)
2017/10/12 Javascript
js 获取json数组里面数组的长度实例
2017/10/31 Javascript
在vue项目中使用sass的配置方法
2018/03/20 Javascript
JS实现对json对象排序并删除id相同项功能示例
2018/04/18 Javascript
vue在路由中验证token是否存在的简单实现
2019/11/11 Javascript
js前端传json后台接收‘‘被转为quot的问题解决
2020/11/12 Javascript
[03:09]2014DOTA2国际邀请赛 Mushi前队友送上祝福
2014/07/12 DOTA
[51:20]完美世界DOTA2联赛PWL S2 Magma vs PXG 第一场 11.28
2020/12/01 DOTA
Python自动登录126邮箱的方法
2015/07/10 Python
详解Python迭代和迭代器
2016/03/28 Python
详解配置Django的Celery异步之路踩坑
2018/11/25 Python
解决在Python编辑器pycharm中程序run正常debug错误的问题
2019/01/17 Python
CSS3属性box-sizing使用指南
2014/12/09 HTML / CSS
canvas线条的属性详解
2018/03/27 HTML / CSS
英国复古皮包品牌:Beara Beara
2018/07/18 全球购物
解决python 输出到csv 出现多空行的情况
2021/03/24 Python
机电工程学生自荐信范文
2013/12/07 职场文书
《逃家小兔》教学反思
2014/02/23 职场文书
保密普查工作实施方案
2014/02/25 职场文书
活动总结报告格式
2014/05/09 职场文书
幼儿园师德师风学习材料
2014/05/29 职场文书
励志演讲稿500字
2014/08/21 职场文书
公务员年度考核评语
2014/12/31 职场文书
电影圆明园观后感
2015/06/03 职场文书
《追风筝的人》:人心中的成见是座大山,但请不忘初心
2019/11/15 职场文书