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 相关文章推荐
file模式访问网页时iframe高度自适应解决方案
Jan 16 Javascript
jQuery实现友好的轮播图片特效
Jan 12 Javascript
js+css实现select的美化效果
Mar 24 Javascript
jquery插件方式实现table查询功能的简单实例
Jun 06 Javascript
jQuery实现checkbox列表的全选、反选功能
Nov 24 Javascript
echarts3 使用总结(绘制各种图表,地图)
Jan 05 Javascript
jQuery图片拖动组件Dropzone用法示例
Jan 17 Javascript
JS完成画圆圈的小球
Mar 07 Javascript
vue中的数据绑定原理的实现
Jul 02 Javascript
vue中各选项及钩子函数执行顺序详解
Aug 25 Javascript
vue 解决异步数据更新问题
Oct 29 Javascript
小程序点餐界面添加购物车左右摆动动画
Sep 23 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
深思 PHP 数组遍历的差异(array_diff 的实现)
2008/03/23 PHP
有关 PHP 和 MySQL 时区的一点总结
2008/03/26 PHP
php面向对象全攻略 (五) 封装性
2009/09/30 PHP
PHP性能优化工具篇Benchmark类调试执行时间
2011/12/06 PHP
php查找指定目录下指定大小文件的方法
2014/11/28 PHP
PHP生成唯一订单号的方法汇总
2015/04/16 PHP
PHP编程获取音频文件时长的方法【基于getid3类】
2017/04/20 PHP
Prototype源码浅析 Enumerable部分之each方法
2012/01/16 Javascript
JSF中confirm弹出框的用法示例介绍
2014/01/07 Javascript
javascript事件冒泡详解和捕获、阻止方法
2014/04/12 Javascript
ECMAScript5中的对象存取器属性:getter和setter介绍
2014/12/08 Javascript
js获得当前系统日期时间的方法
2015/05/06 Javascript
jQuery获取上传文件的名称的正则表达式
2015/05/21 Javascript
实例讲解jQuery EasyUI tree中state属性慎用
2016/04/01 Javascript
js获取当前年月日-YYYYmmDD格式的实现代码
2016/06/01 Javascript
JS Array创建及concat()split()slice()的使用方法
2016/06/03 Javascript
关于不同页面之间实现参数传递的几种方式讨论
2017/02/13 Javascript
Less 安装及基本用法
2018/05/05 Javascript
详解Vue CLI3 多页应用实践和源码设计
2018/08/30 Javascript
JS求解两数之和算法详解
2020/04/28 Javascript
JS简易计算器实例讲解
2020/06/30 Javascript
[44:40]Serenity vs Pain 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python subprocess 杀掉全部派生的子进程方法
2017/01/16 Python
python3发送邮件需要经过代理服务器的示例代码
2019/07/25 Python
如何使用Python发送HTML格式的邮件
2020/02/11 Python
python numpy生成等差数列、等比数列的实例
2020/02/25 Python
Pycharm导入anaconda环境的教程图解
2020/07/31 Python
iPad和Surface Pro蓝牙键盘:Brydge
2018/11/10 全球购物
机电一体化专业应届本科生求职信
2013/09/27 职场文书
外语专业毕业生自我评价分享
2013/10/05 职场文书
车间主管岗位职责
2013/11/14 职场文书
校运会入场式解说词
2014/02/10 职场文书
大学生团员个人总结
2015/02/14 职场文书
公司门卫岗位职责
2015/04/13 职场文书
2016年6.5世界环境日宣传活动总结
2016/04/01 职场文书
实习报告范文之电话客服岗位
2019/07/26 职场文书