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 相关文章推荐
jQuery 使用手册(七)
Sep 23 Javascript
关于JAVASCRIPT urldecode URL解码的问题
Jan 08 Javascript
jquery中的过滤操作详细解析
Dec 02 Javascript
使用jQuery实现更改默认alert框体
Apr 13 Javascript
jQuery实现新消息在网页标题闪烁提示
Jun 23 Javascript
jQuery控制frames及frame页面JS的方法
Mar 08 Javascript
AngularJS基础 ng-include 指令简单示例
Aug 01 Javascript
javascript使用 concat 方法对数组进行合并的方法
Sep 08 Javascript
EsLint入门学习教程
Feb 17 Javascript
Vue的事件响应式进度条组件实例详解
Feb 04 Javascript
vue-router+nginx 非根路径配置方法
Jun 30 Javascript
Layui多选只有最后一个值的解决方法
Sep 02 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
《Pokemon Sword·Shield》系列WEB动画《薄明之翼》第2话声优阵容公开!
2020/03/06 日漫
PHP获取当前文件所在目录 getcwd()函数
2009/05/13 PHP
上传文件先创建目录 再上传到目录里面去
2010/12/29 PHP
浅析PHP中strlen和mb_strlen的区别
2014/08/31 PHP
4种PHP异步执行的常用方式
2015/12/24 PHP
项目中应用Redis+Php的场景
2016/05/22 PHP
ThinkPHP实现分页功能
2017/04/28 PHP
php根据地址获取百度地图经纬度的实例方法
2019/09/03 PHP
javascript中方便增删改cookie的一个类
2012/10/11 Javascript
JS注释所产生的bug 即使注释也会执行
2013/11/19 Javascript
整理Javascript流程控制语句学习笔记
2015/11/29 Javascript
js判断移动端是否安装某款app的多种方法
2015/12/18 Javascript
Bootstrap实现带暂停功能的轮播组件(推荐)
2016/11/25 Javascript
nodejs集成sqlite使用示例
2017/06/05 NodeJs
vue.js配合$.post从后台获取数据简单demo分享
2018/08/11 Javascript
JavaScript指定断点操作实例教程
2018/09/18 Javascript
vue实现从外部修改组件内部的变量的值
2020/07/30 Javascript
python传递参数方式小结
2015/04/17 Python
Python中time模块和datetime模块的用法示例
2016/02/28 Python
在python3环境下的Django中使用MySQL数据库的实例
2017/08/29 Python
python利用高阶函数实现剪枝函数
2018/03/20 Python
django 自定义过滤器的实现
2019/02/26 Python
python:目标检测模型预测准确度计算方式(基于IoU)
2020/01/18 Python
基于selenium及python实现下拉选项定位select
2020/07/22 Python
python实现人工蜂群算法
2020/09/18 Python
Python 找出英文单词列表(list)中最长单词链
2020/12/14 Python
LocalStorage记住用户和密码功能
2017/07/24 HTML / CSS
印度尼西亚综合购物网站:Lazada印尼
2016/09/07 全球购物
英语专业推荐信
2013/11/16 职场文书
日化店促销方案
2014/03/26 职场文书
2015年元旦标语大全
2014/12/09 职场文书
事业单位财务人员岗位职责
2015/04/14 职场文书
用电申请报告范文
2015/05/18 职场文书
家电创业计划书
2019/08/05 职场文书
JavaScript中isPrototypeOf函数
2021/11/07 Javascript
P站美图推荐——变身女主角特辑
2022/03/20 日漫