JavaScript 逻辑与(&&) 与 逻辑或(||) 运算规则
逻辑与(&&)
逻辑与(&&)操作可以应用于任何的操作类型,不仅仅是布尔值,
在有一个操作数不是布尔值的情况下,&&操作符就不一定返回布尔值:遵循下面规则:
1.如果第一个操作数是对象(广义),则返回第二个操作数
1alert('GeCan' && null) // null
2alert('GeCan' && NaN) // NaN
3alert('GeCan' && 0) // 0
4alert('GeCan' && false) // false
5alert('GeCan' && 'GeCan') // "GeCan"
6alert('GeCan' && undefined) // undefined
7alert('0' && 'GeCan') // 'GeCan'
8alert(1 && 'GeCan') // 'GeCan'
2.如果第二个操作数是对象,只有在第一个操作数求值为 true 的情况下才返回该对象
第一个操作数求值为 true;返回该对象
---当第一个操作数是对象,也返回该对象(参考第一点)
1alert(true && 'GeCan') // 'GeCan'
---否则直接返回第一个数(短路操作)
1alert(null && 'GeCan') // null
2alert(NaN && 'GeCan') // NaN
3alert(0 && 'GeCan') // 0
4alert(false && 'GeCan') // false
5alert(undefined && 'GeCan') // undefined
6alert('' && 'GeCan') // '';
---注意,当第一个操作数求值为 true, 但第二个操作数未定义时,会报错
1alert(true && someUndefinedVariable) // error;someUndefinedVariable is not defined
3.如果两个都是对象返回第二个(与上面规则有点重复)
4.如果有一个操作数是 null, NaN,0,false 或 undefined 或 '',则返回它们自己
---第一种情况,这些操作符在第一个,参照上面第2条规则的第一点,直接返回它们自己(短路);
---第二种情况,这些操作符在第二个(第一个操作符求值为 true 之后),也返回它们自己;
1alert(true && null) // null
2alert(true && NaN) // NaN
3alert(true && 0) // 0
4alert(true && false) // false
5alert(true && undefined) // undefined
6alert(true && '') // ''
上述规则总结
逻辑与(&&)看左边的值是真还是假,如果是真,返回的是右边的值,如果是假返回的是左边的值(只有false 、0、NaN、null、undefined、空字符串为假, 其余都是真)
逻辑或(||)
逻辑或(||) 和 逻辑与(&&) 的操作相类似只要有一个不是布尔值,||也不一定返回布尔值,遵循下面规则:
1.第一个是对象,就返回第一个(短路)
1alert('GeCan' || undefined) // "GeCan"
2alert('GeCan' || 'KaiKai') // "GeCan"
2.第一个是 false, null, NaN ,0 或 undefined 或 '',则返回第二个操作数;
---第一个操作数求值结果为 false; 返回第二个操作数
1alert(false || null) // null
2alert(false || NaN) // NaN
3alert(false || 0) // 0
4alert(false || false) // false
5alert(false || 'GeCan') // "GeCan"
6alert(false || undefined) // undefined
---注意,当第一个操作数求值为 false,但第二个操作数未定义时,会报错
1alert(false || someUndefinedVariable); // error; someUndefinedVariable is not defined
第一个是 null; 返回第二个操作数
1alert(null || null) // null
2alert(null || NaN) // NaN
3alert(null || 0) // 0
4alert(null || false) // false
5alert(null || 'GeCan') // "GeCan"
6alert(null || undefined) // undefined
第一个是 NaN; 返回第二个操作数
1alert(NaN || NaN) // NaN
2alert(NaN || null) // null
3alert(NaN || 0) // 0
4alert(NaN || false) // false
5alert(NaN || 'GeCan') // 'GeCan'
6alert(NaN || undefined) // undefined
第一个是 0;返回第二个操作数
1alert(0 || null) // null
2alert(0 || NaN) // NaN
3alert(0 || 0) // 0
4alert(0 || false) // false
5alert(0 || 'GeCan') // "GeCan"
6alert(0 || undefined) // undefined
第一个是 undefined; 返回第二个操作数
1alert(undefined || null) // null
2alert(undefined || NaN) // NaN
3alert(undefined || 0) // 0
4alert(undefined || false) // false
5alert(undefined || 'GeCan') // "GeCan"
6alert(undefined || undefined) // undefined
第一个是 ''; 返回第二个操作数
1alert('' || null) // null
2alert('' || NaN) // NaN
3alert('' || 0) // 0
4alert('' || false) // false
5alert('' || 'GeCan') // "GeCan"
6alert('' || undefined) // undefined
上述规则总结,
逻辑或(||) 首先看左边的值是真还是假,如果是真,返回的是左边的值,如果是假返回的是右边的值(只有 false 、0、NaN、null、undefined、空字符串为假, 其余都是真)
关于逻辑与(&&)与逻辑或(||)只要记住下面两条规则就够了:
逻辑与(&&)
看左边的值是真还是假,如果是真,返回的是右边的值,如果是假返回的是左边的值
(只有 false 、0、NaN、null、undefined、空字符串为假, 其余都是真)
逻辑或(||)
看左边的值是真还是假,如果是真,返回的是左边的值,如果是假返回的是右边的值
(只有 false 、0、NaN、null、undefined、空字符串为假, 其余都是真)
逻辑运算的应用
1.利用逻辑或(||)
例子一 操作DOM
如果变量的值 不是 false, null, NaN ,0 或 undefined 或 '',则传入该变量;
1function addMessage(message){
2 message = message || 'default message';
3
4 var el = document.createElement('p');
5 el.innerHTML = message;
6
7 document.body.appendChild(el);
8}
9
10addMessage(); // 操作默认参数
11addMessage('hello world') // 操作我们传入的参数
---谨慎使用 || 填充默认值 !!!
例子二
1function Foo(value){
2 value = value || 'default value';
3 return value;
4}
5
6Foo() // 'default value' ;传递默认参数
7Foo('你好') // '你好'
注意:这里传入 false, null, NaN ,0 或 undefined 或 '' 等值,都会使用第二个默认参数!!!
然而实际上只有 undefined 这一种情况才应该被认为是用户没有指定其值,需要使用后备的默认值。
改进版本
1function Foo(value){
2 value = value !== undefined ? value : 'defaule value';
3 return value;
4}
通过这种方式给参数设置默认值,只有在传入 undefined,它的值才会被强制替换为默认值
1Foo(undefined) // "defaule value"
2//以下这些值,都不会被强制替换 (安全了许多!!!)
3Foo('') // ''
4Foo(0) // 0
5Foo(NaN) // NaN
6Foo(null) // null
7Foo(false) // false
补充 ES6 可以这样给参数设默认值
1function Foo(value = 'default value'){
2 return value;
3}
4// 替换为默认值
5Foo(undefined) // "default value"
6// 没有替换;很安全
7Foo('') // ''
8Foo(0) // 0
9Foo(NaN) // NaN
10Foo(null) // null
11Foo(false) // false
2.综合利用 逻辑与(&&) 和 逻辑或(||)
例子一
1function whatDoesItDo(mood){
2 return mood && "I like this" || "I don't like this";
3}
当 mood 求值结果为 true, 返回 "I like this"(A来代替)
当 mood 求值结果为 false, 返回 "I dont like this"(B来代替)
当 mood 是对象,其也会显示 A。
有点 升级版三元运算符 的感觉;
例子二
1...
2this.canSeen(imglist[i]) && this.loadImage(imglist[i], i);
3...
缩写,相当于if true
当第一个函数返回的布尔值为true,那么调用第二个函数
1...
2if(this.canSeen(imglis[i])) {
3 this.loadImage(imglist[i], i)
4}
5...
---以上---
JavaScript 逻辑与(&&) 与 逻辑或(||) 运算规则的更多相关文章
- JavaScript学习总结(四)——逻辑OR运算符详解
在JavaScript中,逻辑OR运算符用||表示 1 var bTrue = true; 2 var bFalse = false; 3 var bResult = bTrue || bFalse; ...
- javascript使用两个逻辑非运算符(!!)的原因
javascript使用两个逻辑非运算符(!!)的原因: 在有些代码中可能大家可能会注意到有些地方使用了两个逻辑非运算符,第一感觉就是没有必要,比如操作数是true的话,使用两个逻辑非的返回值还是tr ...
- JavaScript学习总结(二)——逻辑Not运算符详解
在JavaScript 中,逻辑NOT运算符与C和Java中的逻辑 NOT 运算符相同,都由感叹号(!)表示.与逻辑 OR 和逻辑 AND 运算符不同的是,逻辑 NOT 运算符返回的一定是 Boole ...
- 【JavaScript】JavaScript赋值语句中的逻辑与&&和逻辑或||
在其他语言中,我们往往看到逻辑符号出现在判断语句当中,如 if(a||b){} 但在一些js相关的面试题或者书中,我们有时会看到逻辑与&&和逻辑或||符号出现在赋值语句或者返回语句中, ...
- 仔细看看Javascript中的逻辑与(&&)和逻辑或(||)
学过Java和C的人,都知道逻辑与(&&)和逻辑或(||),他们都是短路运算符,也就是说,对于&&来说,只要左边的操作数是false,它就不会再去判断右边的操作数是tr ...
- CPU相关知识---物理CPU数、物理核数、逻辑核数、逻辑CPU数 ?
一.物理CPU数.物理核数.逻辑核数.逻辑CPU数 相互关系??? 物理CPU数 ---> 每个物理CPU对应物理核数 ---> (每个物理核数对应逻辑核数)物理CPU对应逻辑核数 --- ...
- JavaScript学习总结(三)——逻辑And运算符详解
在JavaScript中,逻辑 AND 运算符用双和号(&&)表示 1 var bTrue = true; 2 var bFalse = false; 3 var bResult = ...
- javascript高程笔记:逻辑与和逻辑或
逻辑与和或 逻辑与 当 && 前后两个操作数都是布尔值,无可厚非,同时为true才为true.与其他强类型语言不同的是,javascript逻辑与前后的操作数可以应用于任何类型. 而且 ...
- JS && || 陷阱 javascript 逻辑与、逻辑或 【转】
通常来说逻辑运算a&&b和a||b分别是逻辑与运算和逻辑或运算,返回的是一个布尔值,要么为true,要么为false. 比如在PHP里面a&&b返回类型永远是布尔值,非 ...
随机推荐
- 语义分割学习之SegNet的C++编译
Abstract 安装好Segnet并使用Python进行训练和测试之后,考虑项目的应用,需要在C++的工程环境下进行继续开发,所以这里的主要内容是用C++建立工程,使用相应的数据集和权重参数文件进行 ...
- 【笔记】vue和ssm开发接口联调跨域问题
爬了两个小时的大坑 前端在github上拉了个vue项目,由于从来没正式学过vue,跨域这个问题一直困扰了很久. 目前暂时能用的解决方案(开发环境)就是: 前端在vue.config.js中加入代理. ...
- 【阿里巴巴-高德-汽车事业部】【内推】Java技术专家、前端技术专家、C++技术专家(长期招聘)
简历接收邮箱:yx185737@alibaba-inc.com 邮件请备注来自CSDN 一.Java技术专家 职位描述 研究汽车智能化和在线服务前沿技术,从事在线数据服务和车联网服务的设计和研发 负责 ...
- 机器学习 TensorFlow 实现智能鉴黄
前言 最近在做一款图床服务,关注公号的小伙伴一定记得小柒曾说过,会在周末放出的,不好意思放大家鸽子了.之所以一直没敢放出,是因为鉴黄接口一直没调试好,虽然我对公号的小伙伴百分之百信任,奈何互联网鱼龙混 ...
- Pod镜像拉取策略imagePullPolicy
默认值是IfNotPresent Always 总是拉取: 首先获取仓库镜像信息, 如果仓库中的镜像与本地不同,那么仓库中的镜像会被拉取并覆盖本地. 如果仓库中的镜像与本地一致,那么不会拉取镜像. 如 ...
- Siamese-RPN论文阅读
https://www.cnblogs.com/zhengyuqian/p/10609737.html
- 新闻实时分析系统-inux环境准备与设置
1.Linux系统常规设置 1)设置ip地址 项目视频里面直接使用界面修改ip比较方便,如果Linux没有安装操作界面,需要使用命令:vi /etc/sysconfig/network-scripts ...
- 【2018寒假集训Day 7】【最短路径】三种算法的模板
Luogu单源最短路径模版题 dijkstra #include<cstdio> #include<vector> using namespace std; const int ...
- 常见 MIME 类型列表(转)
本文转自:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Complete_list_of_MI ...
- 图解 Spring:HTTP 请求的处理流程与机制【5】
5. HTTP 请求处理相关配置文件说明 HTTP 请求穿越的整个空间是分层的,包括:Web 容器.Web 应用.Spring 框架等,它们每层都是通过配置文件配置初始化的,这是一种松耦合的架构设计. ...