JavaScript中的&&与||的用法(不用在判断布尔值上)

如题所述,JavaScript中&&和||可以用在普通的语句中,但是具体没有理解透它们的机制,求讲解,谢谢!
类似这样
var orResult = a || b|| c;
var andResult = a && b && c;

阅读 27.4k
9 个回答

var x = a || b || c 等价于:

var x;
if(a){
    x = a;
} else if(b){
    x = b;
} else {
    x = c;
}

var x = a && b && c 等价于:

var x = a;
if(a){
    x = b;
    if(b){
        x = c;
    }
}

其实这种特性叫短路求值,&& 会返回第一个假值(0, null, "", undefined, NaN),而 || 则会返回第一个真值。

所以 && 有时候会用来代替 if (expression) doSomething(),转成 && 方式就是 expression && doSomething()

|| 比较用来在函数中设置默认值,比如

function doSomething(arg1, arg2, arg3) {
    arg1 = arg1 || 'arg1Value';
    arg2 = arg2 || 'arg2Value';
}

不过还需要看具体的使用场景,就比如如果要求 doSomething() 传入的 arg1 为一个数值,则上面的写法就会出现问题(在传入 0 的时候被认为是一个假值而使用默认值)。

现在个人比较常用的方法只判断是否与 undefined 相等,比如

function doSomething(arg) {
    arg = arg !== void 0 ? arg : 0;
}

机制就是根据布尔值返回起决定性作用的值

我只能说你举得栗子也是在判断!
requestFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame ||window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame

新手上路,请多包涵

你的问题表述不是特别清楚啊,是不是下面代码中||和&&使用的问题:

var orResult = a || b;
var andResult = a && b;

如果是的话,运算结果如下(参考W3CSchool):

&&操作结果

  • 如果一个运算数是对象,另一个是 Boolean 值,返回该对象

  • 如果两个运算数都是对象,返回第二个对象

  • 如果某个运算数是 null,返回 null

  • 如果某个运算数是 NaN,返回 NaN

  • 如果某个运算数是 undefined,发生错误

||操作结果

  • 如果一个运算数是对象,并且该对象左边的运算数值均为 false,则返回该对象

  • 如果两个运算数都是对象,返回第一个对象

  • 如果最后一个运算数是 null,并且其他运算数值均为 false,则返回 null

  • 如果最后一个运算数是 NaN,并且其他运算数值均为 false,则返回 NaN

  • 如果某个运算数是 undefined,发生错误

逻辑与 (&&) expr1 && expr2 如果expr1 能转换成false则返回expr1,否则返回expr2.

   那如果这样的式子:
            d = a && b && c;
   是不是就是,当a为false时,将a赋值给d,当a为true就判断b;
             当b为false时,将b赋值给d,当b为true就直接将c赋值给d了
             而不管c是true还是false
            

逻辑或 (||) expr1 || expr2 如果expr1能转换成true则返回expr1,否则返回expr2.

    那如果这样的式子:
            d = a || b || c;
    是不是就是,当a为true时,将a赋值给d,当a为false就判断b;
             当b为true时,将b赋值给d,当b为false就直接将c赋值给dl了
             而不管c是true还是false
             

不知道我这样理解是不是正确的 @公子

逻辑判断的短路原则
1、&&运算:
a && b ; a如果为false了(空字符,0,null或undefined等),b就没必要计算了,结果肯定为false,直接返回a的值,因为&&运算符号要返回true要求运算符两边同时为true。
console.log(0 && 1); // 0
console.log(null && 1); // null
console.log(2 && 0 && 1); // 0
console.log(2 && 0 && ...&& 1); // 0

2、||运算符:
a||b; 因为||运算符两边只要有一个为true,整个表达式的结果就为true了,当a为true时,b的计算已经无意义,所以直接返回a的值就ok了

console.log(0 || 1); // 1
console.log(null || 1); // 1
console.log(2 || 0 || 1); // 2
console.log(2 || 1 || 0 ||...|| 1); //2

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题