A-A+

javascript的逻辑或||和逻辑与&&问题?

2016年03月29日 jquery 暂无评论 阅读 98 次

“&&”运算符可以从三个不同的层次进行理解。

最简单的第一层理解是,当操作数都是布尔值的时候,“&&”对两个值执行布尔与(AND)操作,只有在第一个操作数和第二个操作数都是true的时候,它才返回true。如果其中一个操作数是false,它返回false。

“&&”常用来连接两个关系表达式:

  x == 0 && y == 0 // 只有在x和y都是0的时候,才返回true

但是“&&”的操作数并不一定是布尔值。对“&&”的第二层理解是,“&&”可以对真值和假值进行布尔与(AND)操作。如果两个操作数都是真值,那么返回一个真值;否则,至少一个操作数是假值的话,则返回一个假值。在JavaScript中任何希望使用布尔值的地方,表达式和语句都会将其当做真值或假值来对待,因此实际上“&&”并不总是返回true和false。

例如:

     3&&4 //返回一个真值 4 
    2&&null //返回一个假值 null
    undefined&&null //返回一个假值 undefined
    //假值是false、null、undefined、0、-0、NaN和"",所有其他的值包括所有对象都是真值

我们深入讨论对“&&”的第三层(也是最后一层)理解。运算符首先计算左操作数的值,即首先计算“&&”左侧的表达式。如果计算结果是假值,那么整个表达式的结果一定也是假值,因此“&&”这时简单地返回左操作数的值,而并不会对右操作数进行计算。反过来讲,如果左操作数是真值,那么整个表达式的结果则依赖于右操作数的值。如果右操作数是真值,那么整个表达式的值一定是真值;如果右操作数是假值,那么整个表达式的值一定是假值。

因此,当左操作数是真值时,“&&”运算符将计算右操作数的值并将其返回作为整个表达式的计算结果:

var o = { x : 1 };
var p = null;
o &&o.x // =>1:o 是真值,因此返回值为o.x
p &&
p.x //=>null: p是假值,因此将其返回,而并不去计算p.x

这对于理解“&&”可能不会去计算右操作数的情况至关重要,在上述示例代码中,变量p的值是null,而如果计算表达式p.x的话则会抛出一个类型错误异常。但是示例代码使用了“&&”的一种符合语言习惯的用法,因此只有在p为真值(不能是null或者undefined)的情况下才会计算p.x。

“&&”的行为有时称做“短路”(short circuiting),我们也会经常看到很多代码利用了这一特性来有条件地执行代码。

例如,下面两行JavaScript代码是完全等价的:

if (a == b) stop(); //只有在a==b的时候才调用stop()
(a == b) &&stop(); //同上

尽管“&&”可以按照第二层和第三层的理解进行一些复杂表达式运算,但大多数情况下,“&&”仅用来对真值和假值做布尔计算。

“||”运算符对两个操作数做布尔或(OR)运算。如果其中一个或者两个操作数是真值,它返回一个真值。如果两个操作数都是假值,它返回一个假值。

尽管“||”运算符大多数情况下只是做简单布尔或(OR)运算,和“&&”一样,它也具有一些更复杂的行为。它会首先计算第一个操作数的值,也就是说会首先计算左侧的表达式。如果计算结果为真值,那么返回这个真值。否则,再计算第二个操作数的值,即计算右侧的表达式,并返回这个表达式的计算结果。

这个运算符最常用的方式是用来从一组备选表达式中选出第一个真值表达式:

// 如果max_width已经定义了,直接使用它;否则在preferences对象中查找max_width
// 如果没有定义它,则使用一个写死的常量
var max = max_width || preferences.max_width || 500;

这种惯用法通常用在函数体内,用来给参数提供默认值:

// 将o的成员属性复制到p,并返回
pfunction copy(o, p) {   
     p = p || {}; //如果向参数p没有传入任何对象,则使用一个新创建的对象    
     // 函数体内的主逻辑
     }
标签:

给我留言

Copyright © web前端技术开发个人博客 保留所有权利  京ICP备14060653号 Theme  Ality

用户登录