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 相关文章推荐
获取任意Html元素与body之间的偏移距离 offsetTop、offsetLeft (For:IE5+ FF1 )[
Dec 22 Javascript
在修改准备发的批量美化select+可修改select时,在非IE下发现了几个问题
Jan 09 Javascript
javascript 放大镜效果js组件 qsoft.PopBigImage.v0.35 加入了chrome支持
Apr 07 Javascript
Js 获取HTML DOM节点元素的方法小结
Apr 24 Javascript
JavaScript indexOf方法入门实例(计算指定字符在字符串中首次出现的位置)
Oct 17 Javascript
js实现的鼠标滚轮滚动切换页面效果(类似360默认页面滚动切换效果)
Jan 27 Javascript
JS中多种方式创建对象详解
Mar 22 Javascript
Vue 组件间的样式冲突污染
Aug 31 Javascript
利用Three.js如何实现阴影效果实例代码
Sep 26 Javascript
原生JavaScrpit中异步请求Ajax实现方法
Nov 03 Javascript
微信小程序websocket实现聊天功能
Mar 30 Javascript
vue data变量相互赋值后被实时同步的解决步骤
Aug 05 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之规范编程命名小结
2013/05/15 PHP
PHP判断用户是否已经登录(跳转到不同页面或者执行不同动作)
2016/09/22 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
TP5框架实现签到功能的方法分析
2020/04/05 PHP
Jquery选择器 $实现原理
2009/12/02 Javascript
JavaScript 高效运行代码分析
2010/03/18 Javascript
自己整理的一个javascript日期处理函数
2010/10/16 Javascript
javascript-简单的日历实现及Date对象语法介绍(附图)
2013/05/30 Javascript
jQuery的attr与prop使用介绍
2013/10/10 Javascript
javascript实现保留两位小数的多种方法
2015/12/18 Javascript
Knockoutjs 学习系列(一)ko初体验
2016/06/07 Javascript
微信小程序点击控件修改样式实例详解
2017/07/07 Javascript
最适应的vue.js的form提交涉及多种插件【推荐】
2018/08/27 Javascript
AngularJS 事件发布机制
2018/08/28 Javascript
微信小程序制作表格的方法
2019/02/14 Javascript
layer.msg()去掉默认时间,实现手动关闭的方法
2019/09/12 Javascript
如何解决jQuery 和其他JS库的冲突
2020/06/22 jQuery
Python入门篇之面向对象
2014/10/20 Python
Python中的XML库4Suite Server的介绍
2015/04/14 Python
Python中使用PyQt把网页转换成PDF操作代码实例
2015/04/23 Python
Python3简单实例计算同花的概率代码
2017/12/06 Python
python实现k-means聚类算法
2018/02/23 Python
python最长回文串算法
2018/06/04 Python
python之pyqt5通过按钮改变Label的背景颜色方法
2019/06/13 Python
python multiprocessing模块用法及原理介绍
2019/08/20 Python
完美解决pycharm导入自己写的py文件爆红问题
2020/02/12 Python
Django中文件上传和文件访问微项目的方法
2020/04/27 Python
中国跨境海淘网站:考拉海购
2016/08/01 全球购物
美国当红的名品折扣网:Gilt Groupe
2016/08/15 全球购物
枚举与#define宏的区别
2014/04/30 面试题
毕业生就业推荐信范文
2013/12/01 职场文书
就业自荐书
2013/12/05 职场文书
协议书的格式
2014/04/23 职场文书
党的作风建设心得体会
2014/10/22 职场文书
Django+Nginx+uWSGI 定时任务的实现方法
2022/01/22 Python
各种货币符号快捷输入
2022/02/17 杂记