JavaScript 逻辑与(&&) 与 逻辑或(||) 的逻辑运算规则理解

逻辑与(&&)

逻辑与(&&)操作可以应用于任何的操作类型,不仅仅是布尔值,
在有一个操作数不是布尔值的情况下,&&操作符就不一定返回布尔值:遵循下面规则:

1. 如果第一个操作数是对象(广义),则返回第二个操作数

alert(‘GeCan‘ && null)      // null
alert(‘GeCan‘ && NaN)       // NaN
alert(‘GeCan‘ && 0)         // 0
alert(‘GeCan‘ && false)     // false
alert(‘GeCan‘ && ‘GeCan‘)   // "GeCan"
alert(‘GeCan‘ && undefined) // undefined
alert(‘0‘ && ‘GeCan‘)       // ‘GeCan‘
alert(1 && ‘GeCan‘)         // ‘GeCan‘

2. 如果第二个操作数是对象,只有在第一个操作数求值为 true 的情况下才返回该对象
第一个操作数求值为 true;返回该对象
// 当第一个操作数是对象,也返回该对象(参考第一点)

alert(true && ‘GeCan‘)      // ‘GeCan‘

否则直接返回第一个数(短路操作)
alert(null && ‘GeCan‘)      // null
alert(NaN && ‘GeCan‘)       // NaN
alert(0 && ‘GeCan‘)         // 0
alert(false && ‘GeCan‘)     // false
alert(undefined && ‘GeCan‘) // undefined
alert(‘‘ && ‘GeCan‘)        // ‘‘;

注意,当第一个操作数求值为 true, 但第二个操作数未定义时,会报错

alert(true && someUndefinedVariable) // error;someUndefinedVariable is not defined

3. 如果两个都是对象返回第二个(与上面规则有点重复)

4.如果有一个操作数是 null, NaN,0,false 或 undefined 或 ‘‘,则返回 它们自己
第一种情况,这些操作符在第一个,参照上面第2条规则的第一点,直接返回它们自己(短路);
第二种情况,这些操作符在第二个(第一个操作符求值为 true 之后),也返回它们自己

alert(true && null)      // null
alert(true && NaN)       // NaN
alert(true && 0)         // 0
alert(true && false)     // false
alert(true && undefined) // undefined
alert(true && ‘‘)        // ‘‘

上述规则总结,
逻辑与(&&) 看左边的值是真还是假,如果是真,返回的是右边的值,如果是假返回的是左边的值;
(只有 false 、0、NaN、null、undefined、空字符串为假, 其余都是真)

---------------------------------------------------------------------------------------------------------------------------

逻辑或(||)

逻辑或(||) 和 逻辑与(&&) 的操作相类似只要有一个不是布尔值,||也不一定返回布尔值,遵循下面规则:

1. 第一个是对象,就返回第一个(短路)

alert(‘GeCan‘ || undefined) // "GeCan"
alert(‘GeCan‘ || ‘KaiKai‘)  // "GeCan"

2. 第一个是 false, null, NaN ,0 或 undefined 或 ‘‘,则返回第二个操作数;

·第一个操作数求值结果为 false; 返回第二个操作数

alert(false || null)      // null
alert(false || NaN)       // NaN
alert(false || 0)         // 0
alert(false || false)     // false
alert(false || ‘GeCan‘)   // "GeCan"
alert(false || undefined) // undefined

注意,当第一个操作数求值为 false,但第二个操作数未定义时,会报错

alert(false || someUndefinedVariable); // error; someUndefinedVariable is not defined

·第一个是 null; 返回第二个操作数

alert(null || null)       // null
alert(null || NaN)        // NaN
alert(null || 0)          // 0
alert(null || false)      // false
alert(null || ‘GeCan‘)    // "GeCan"
alert(null || undefined)  // undefined

·第一个是 NaN; 返回第二个操作数

alert(NaN || NaN)         // NaN
alert(NaN || null)        // null
alert(NaN || 0)           // 0
alert(NaN || false)       // false
alert(NaN || ‘GeCan‘)     // ‘GeCan‘
alert(NaN || undefined)   // undefined

·第一个是 0;返回第二个操作数

alert(0 || null)          // null
alert(0 || NaN)           // NaN
alert(0 || 0)             // 0
alert(0 || false)         // false
alert(0 || ‘GeCan‘)       // "GeCan"
alert(0 || undefined)     // undefined

·第一个是 undefined; 返回第二个操作数

alert(undefined || null)       // null
alert(undefined  || NaN)       // NaN
alert(undefined || 0)          // 0
alert(undefined  || false)     // false
alert(undefined  || ‘GeCan‘)   // "GeCan"
alert(undefined  || undefined) // undefined

·第一个是 ‘‘; 返回第二个操作数

alert(‘‘ || null)       // null
alert(‘‘  || NaN)       // NaN
alert(‘‘ || 0)          // 0
alert(‘‘  || false)     // false
alert(‘‘  || ‘GeCan‘)   // "GeCan"
alert(‘‘ || undefined)  // undefined

上述规则总结,

逻辑或(||) 首先看左边的值是真还是假,如果是真,返回的是左边的值,如果是假返回的是右边的值
(只有 false 、0、NaN、null、undefined、空字符串为假, 其余都是真)
----------------------------------------------------------------------------------------------------------------------------

因此关于 逻辑与(&&) 与 逻辑或(||) 只要记住下面两条规则就够了:

逻辑与(&&)
看左边的值是真还是假,如果是真,返回的是右边的值,如果是假返回的是左边的值;
(只有 false 、0、NaN、null、undefined、空字符串为假, 其余都是真)

逻辑或(||)
看左边的值是真还是假,如果是真,返回的是左边的值,如果是假返回的是右边的值
(只有 false 、0、NaN、null、undefined、空字符串为假, 其余都是真)

---------------------------------------------------------------------------------------------------------------------------

逻辑运算的应用

1. 利用逻辑或(||)
// 例子一 操作DOM
如果变量的值 不是 false, null, NaN ,0 或 undefined 或 ‘‘,则传入该变量;

function addMessage(message){
    message = message || ‘default message‘;

    var el = document.createElement(‘p‘);
    el.innerHTML = message;

    document.body.appendChild(el);
}

addMessage(); // 操作默认参数
addMessage(‘hello world‘) // 操作我们传入的参数

请注意 谨慎使用 || 填充默认值 !!!
// 例子二

function Foo(value){
    value = value || ‘default value‘;
    return value;
}

Foo() // ‘default value‘ ;传递默认参数
Foo(‘你好‘) // ‘你好‘

注意:这里传入 false, null, NaN ,0 或 undefined 或 ‘‘ 等值,都会使用第二个默认参数!!!
          然而实际上只有 undefined 这一种情况才应该被认为是用户没有指定其值,需要使用后备的默认值。

改进版本

function Foo(value){
    value = value !== undefined ? value : ‘defaule value‘;
    return value;
}

通过这种方式给参数设置默认值,只有在传入 undefined,它的值才会被强制替换为默认值

Foo(undefined)  // "defaule value"

以下这些值,都不会被强制替换 (安全了许多!!!)

Foo(‘‘)     // ‘‘
Foo(0)      // 0
Foo(NaN)    // NaN
Foo(null)   // null
Foo(false)  // false

补充 ES6 可以这样给参数设默认值

function Foo(value = ‘default value‘){
    return value;
}

// 替换为默认值
Foo(undefined)  // "default value"

// 没有替换;很安全
Foo(‘‘)     // ‘‘
Foo(0)      // 0
Foo(NaN)    // NaN
Foo(null)   // null
Foo(false)  // false

2. 综合利用 逻辑与(&&) 和 逻辑或(||)

function whatDoesItDo(mood){
    return mood && "I like this" || "I don‘t like this";
}

当 mood 求值结果为 true, 返回 "I like this"(A来代替)
当 mood 求值结果为 false, 返回 "I dont like this"(B来代替)

当 mood 是对象(广义),其也会显示 A。

有点 升级版三元运算符 的感觉;

以上。

原文地址:https://www.cnblogs.com/rencoo/p/9384710.html

时间: 2024-10-08 05:47:20

JavaScript 逻辑与(&&) 与 逻辑或(||) 的逻辑运算规则理解的相关文章

OJ2.0userInfo页面Modify逻辑bug修复,search功能逻辑实现

这周的主要任务:userInfo页面Modify逻辑bug修复,search功能逻辑实现. (一)Modify逻辑bug修复: 这里存在的bug就是在我们不重置密码的时候按照前面的逻辑是不能提交修改,这个逻辑是错误的,应该改为可以不修改密码也能提交,主要是if逻辑判断的修改 先看一下代码: def userInfo(request, user_id): try: user = User.objects.get(userID = request.session['userID']) except:

javascript要不要用来处理业务逻辑

这个问题,我现在才明白该怎样描述这个已经困惑了我很久的问题,在公司做的项目中,js对于数据验证起到了很大的作用,但是这使得整个项目的业务逻辑变得零散,甚至混乱 现在公司里的项目就是这样的.现在再想想,公司项目中的service层为什么写的那么简单,为什么action很多时候做了service层做的事情 如果用纯java去做处理业务逻辑,去做数据验证,也是可以的,spring框架中也有,但是现在我还不能熟练的掌握,我还需要更多的练习 我现在的想法是,javascript,甚至很好用的jquery,

[网游客户端业务逻辑] unity下使用lua开发业务逻辑

我们的游戏有这样一种情景:客户端中角色需要用到一些公会的数据,但服务器不会在玩家(创角后)一进入到游戏里就推送给玩家,而是需要客户端自己在需要的时候向服务器请求公会的数据,之前的实现就是在请求消息的时候加一个回调函数,消息一回来就执行回调函数继续后续的业务!但后面发现存在这样的不足: 1.有时会用到好多个参数,这就需要每次都把一些无关的参数传给消息请求者,然后回调过来再把这些参数原封不动地传回来,很繁琐: 2.这样的回调写法感觉很不符合人类的顺序思维习惯,有点乱: 回调的lua代码写法类似: -

逻辑与(&&、&)和逻辑或(||、|)

这四个逻辑运算符,大家都知道,但是有时候会凌乱,这里用程序来解释一下,以免忘了. 1.逻辑与 &&和&翻译成中文就是“且”的意思,都是当两个条件同时成立时执行,既然是这样,为什么要两个呢,一起来看下它们的区别,直接上代码: public void fun() { int c = 0; int d = 0; if ((c = 10) < d && (d = 10) <= c)//在条件语句中给变量赋值,方便观察条件是否有执行,不要被这个给弄乱了,其实就是先

逻辑与,按位与;逻辑或,按位或 之间的区别

逻辑与.逻辑或.逻辑非是对boolean值得操作,属于离散数学范畴.按位与.按位或.按位非是对计算机位的操作,属于计算机二进制位运算范畴.逻辑与 都是真才真 c中区分&.&&的区别.逻辑或 有真就是真 c中区分|.||的区别.逻辑非 假才真 c中为!.按位与.按位或.按位非按照上面的规则对每一位进行逻辑运算,其中1代表真0代表假. 一个是位操作,一个是条件计算操作逻辑运算符用来判断真假:位操作符用来计算. C/C++ &与&& |与|| 的区别: &

逻辑左移、算术左移、逻辑右移、算术右移区别

逻辑左移=算数左移,右边统一添0 逻辑右移,左边统一添0 算数右移,左边添加的数和符号有关 e.g:1010101010,其中[]是添加的位 逻辑左移一位:010101010[0] 算数左移一位:010101010[0] 逻辑右移一位:[0]101010101 算数右移一位:[1]101010101 转自他人博客.

LVM逻辑卷管理--在线扩容、逻辑卷与卷组容量缩减、逻辑卷快照

LVM逻辑卷管理公司生产环境中使用了LVM逻辑卷管理,所以今天花时间整理一下.通过LVM技术整合所有的磁盘资源进行分区,然后创建PV物理卷形成一个资源池,再划分卷组,最后在卷组上创建不同的逻辑卷,继而初始化逻辑卷,挂载到系统中使用.LVM对比传统硬盘存储的优点1. 统一管理:整合多个磁盘或分区形成一个资源池2. 灵活性:可以使用不同磁盘.不同分区来组成一个逻辑卷3. 可伸缩性:逻辑卷和卷组的容量都可以使用命令来扩展或者缩减,且不会影响破坏原有数据,支持磁盘热插拔.4. 支持热插拔5. 支持在线数

逻辑回归-5. scikit-learn中的逻辑回归

scikit-learn中的逻辑回归 构造数据集 import numpy import matplotlib.pyplot as plt numpy.random.seed(666) X = numpy.random.normal(0,1,size=(200,2)) # 决策边界为二次函数 y = numpy.array(X[:,0]**2 + X[:,1] < 1.5,dtype='int') # 随机改变20个点,目的是添加噪点 for _ in range(20): y[numpy.ra

deep learning学习(四) 逻辑斯蒂(logistic)回归深入理解和matlab程序求参数

第一节中说了,logistic 回归和线性回归的区别是:线性回归是根据样本X各个维度的Xi的线性叠加(线性叠加的权重系数wi就是模型的参数)来得到预测值的Y,然后最小化所有的样本预测值Y与真实值y'的误差来求得模型参数.我们看到这里的模型的值Y是样本X各个维度的Xi的线性叠加,是线性的. Y=WX (假设W>0),Y的大小是随着X各个维度的叠加和的大小线性增加的,如图(x为了方便取1维): 然后再来看看我们这里的logistic 回归模型,模型公式是:,这里假设W>0,Y与X各维度叠加和(这里