逻辑与(&&)

逻辑与(&&)操作可以应用于任何的操作类型,不仅仅是布尔值,

在有一个操作数不是布尔值的情况下,&&操作符就不一定返回布尔值:遵循下面规则:

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 逻辑与(&&) 与 逻辑或(||) 运算规则的更多相关文章

  1. JavaScript学习总结(四)——逻辑OR运算符详解

    在JavaScript中,逻辑OR运算符用||表示 1 var bTrue = true; 2 var bFalse = false; 3 var bResult = bTrue || bFalse; ...

  2. javascript使用两个逻辑非运算符(!!)的原因

    javascript使用两个逻辑非运算符(!!)的原因: 在有些代码中可能大家可能会注意到有些地方使用了两个逻辑非运算符,第一感觉就是没有必要,比如操作数是true的话,使用两个逻辑非的返回值还是tr ...

  3. JavaScript学习总结(二)——逻辑Not运算符详解

    在JavaScript 中,逻辑NOT运算符与C和Java中的逻辑 NOT 运算符相同,都由感叹号(!)表示.与逻辑 OR 和逻辑 AND 运算符不同的是,逻辑 NOT 运算符返回的一定是 Boole ...

  4. 【JavaScript】JavaScript赋值语句中的逻辑与&&和逻辑或||

    在其他语言中,我们往往看到逻辑符号出现在判断语句当中,如 if(a||b){} 但在一些js相关的面试题或者书中,我们有时会看到逻辑与&&和逻辑或||符号出现在赋值语句或者返回语句中, ...

  5. 仔细看看Javascript中的逻辑与(&&)和逻辑或(||)

    学过Java和C的人,都知道逻辑与(&&)和逻辑或(||),他们都是短路运算符,也就是说,对于&&来说,只要左边的操作数是false,它就不会再去判断右边的操作数是tr ...

  6. CPU相关知识---物理CPU数、物理核数、逻辑核数、逻辑CPU数 ?

    一.物理CPU数.物理核数.逻辑核数.逻辑CPU数 相互关系??? 物理CPU数 ---> 每个物理CPU对应物理核数 ---> (每个物理核数对应逻辑核数)物理CPU对应逻辑核数 --- ...

  7. JavaScript学习总结(三)——逻辑And运算符详解

    在JavaScript中,逻辑 AND 运算符用双和号(&&)表示 1 var bTrue = true; 2 var bFalse = false; 3 var bResult = ...

  8. javascript高程笔记:逻辑与和逻辑或

    逻辑与和或 逻辑与 当 && 前后两个操作数都是布尔值,无可厚非,同时为true才为true.与其他强类型语言不同的是,javascript逻辑与前后的操作数可以应用于任何类型. 而且 ...

  9. JS && || 陷阱 javascript 逻辑与、逻辑或 【转】

    通常来说逻辑运算a&&b和a||b分别是逻辑与运算和逻辑或运算,返回的是一个布尔值,要么为true,要么为false. 比如在PHP里面a&&b返回类型永远是布尔值,非 ...

随机推荐

  1. 2019CSP游记

    \(CSP2019\)游记 写在前面 考完,终于深刻地认识到省一似乎和我想象的真不是一个难度.也罢,不然为什么\(NOIP\)改了名还是这么有含金量. 考前一天和一群同学们嚷嚷着要去吃散伙饭,说没拿到 ...

  2. 破解微擎安装,免费搭建微擎,免费破解微擎,微擎破解版本,最新版本V2.1.2,一键安装!!

    ​ 微擎是一款基于WEB2.0(PHP+Mysql)技术架构,免费开源的公众平台管理系统,一款致力于将小程序和公众号商业化.智慧化.场景化的自助引擎.微擎提供公众号.微信小程序.支付宝小程序.百度熊掌 ...

  3. jwt 实践应用以及特殊案例思考

    JSON Web Token 是 rfc7519 出的一份标准,使用 JSON 来传递数据,用于判定用户是否登录状态. jwt 之前,使用 session 来做用户认证. 以下代码均使用 javasc ...

  4. 领扣(LeetCode)转置矩阵 个人题解

    给定一个矩阵 A, 返回 A 的转置矩阵. 矩阵的转置是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引. 示例 1: 输入:[[1,2,3],[4,5,6],[7,8,9]] 输出:[[1,4,7] ...

  5. bat脚本知识总结

    1常用基本命令 1.1 @ 它的作用是让执行窗口中不显示它后面这一行的命令本身 1.2 echo 它其实是一个开关命令,就是说它只有两种状态:打开和关闭.于是就有了echo on 和echo off两 ...

  6. django_5:表单1——文件上传

    上传文件1 class UserForm(forms.Form): name = forms.CharField() headImg = forms.FileField() def regist(re ...

  7. Ubuntu 16.04 安装Maven3.3.9

    1 下载地址 http://maven.apache.org/download.cgi 2 将下载到的apache-maven-3.3.9-bin.tar.gz文件上传到/temp目录下,然后切换到r ...

  8. WPF 修改屏幕DPI,会触发控件重新加载Unload/Load

    修改屏幕DPI,会触发控件的Unloaded/Loaded 现象/重现案例 对Unloaded/Loaded的印象: FrameworkElement, 第一次加载显示时,会触发Loaded.元素被释 ...

  9. Oracle数据库索引

    Oracle数据库索引 在关系数据库中,索引是一种与表有关的数据库结构,它可以使对应于表的SQL语句执行得更快.索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容. 对于数据库来说,索 ...

  10. matlab-汉字unicode编码转换

    str='黑大哥'bianma=unicode2native(str); disp(bianma); pp=native2unicode(bianma);disp(pp)