扫码关注官方订阅号
如题所述,JavaScript中&&和||可以用在普通的语句中,但是具体没有理解透它们的机制,求讲解,谢谢!类似这样var orResult = a || b|| c;var andResult = a && b && c;
业精于勤,荒于嬉;行成于思,毁于随。
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; } }
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Logical_Operators
其实这种特性叫短路求值,&& 会返回第一个假值(0, null, "", undefined, NaN),而 || 则会返回第一个真值。
&&
0
null
""
undefined
NaN
||
所以 && 有时候会用来代替 if (expression) doSomething(),转成 && 方式就是 expression && doSomething()。
if (expression) doSomething()
expression && doSomething()
而 || 比较用来在函数中设置默认值,比如
function doSomething(arg1, arg2, arg3) { arg1 = arg1 || 'arg1Value'; arg2 = arg2 || 'arg2Value'; }
不过还需要看具体的使用场景,就比如如果要求 doSomething() 传入的 arg1 为一个数值,则上面的写法就会出现问题(在传入 0 的时候被认为是一个假值而使用默认值)。
doSomething()
arg1
现在个人比较常用的方法只判断是否与 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
逻辑与 (&&) 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
不知道我这样理解是不是正确的 @公子
https://es5.github.io/#x11.11
逻辑判断的短路原则1、&&运算: a && b ; a如果为false了(空字符,0,null或undefined等),b就没必要计算了,结果肯定为false,直接返回a的值,因为&&运算符号要返回true要求运算符两边同时为true。console.log(0 && 1); // 0console.log(null && 1); // nullconsole.log(2 && 0 && 1); // 0console.log(2 && 0 && ...&& 1); // 0
2、||运算符:a||b; 因为||运算符两边只要有一个为true,整个表达式的结果就为true了,当a为true时,b的计算已经无意义,所以直接返回a的值就ok了
console.log(0 || 1); // 1console.log(null || 1); // 1console.log(2 || 0 || 1); // 2console.log(2 || 1 || 0 ||...|| 1); //2
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
var x = a || b || c 等价于:
var x = a && b && c 等价于:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Logical_Operators
其实这种特性叫短路求值,
&&会返回第一个假值(0,null,"",undefined,NaN),而||则会返回第一个真值。所以
&&有时候会用来代替if (expression) doSomething(),转成&&方式就是expression && doSomething()。而
||比较用来在函数中设置默认值,比如不过还需要看具体的使用场景,就比如如果要求
doSomething()传入的arg1为一个数值,则上面的写法就会出现问题(在传入0的时候被认为是一个假值而使用默认值)。现在个人比较常用的方法只判断是否与
undefined相等,比如机制就是根据布尔值返回起决定性作用的值
我只能说你举得栗子也是在判断!
requestFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame ||window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame
你的问题表述不是特别清楚啊,是不是下面代码中||和&&使用的问题:
如果是的话,运算结果如下(参考W3CSchool):
&&操作结果如果一个运算数是对象,另一个是 Boolean 值,返回该对象
如果两个运算数都是对象,返回第二个对象
如果某个运算数是 null,返回 null
如果某个运算数是 NaN,返回 NaN
如果某个运算数是 undefined,发生错误
||操作结果如果一个运算数是对象,并且该对象左边的运算数值均为 false,则返回该对象
如果两个运算数都是对象,返回第一个对象
如果最后一个运算数是 null,并且其他运算数值均为 false,则返回 null
如果最后一个运算数是 NaN,并且其他运算数值均为 false,则返回 NaN
如果某个运算数是 undefined,发生错误
逻辑与 (&&) expr1 && expr2 如果expr1 能转换成false则返回expr1,否则返回expr2.
逻辑或 (||) expr1 || expr2 如果expr1能转换成true则返回expr1,否则返回expr2.
不知道我这样理解是不是正确的 @公子
https://es5.github.io/#x11.11
逻辑判断的短路原则
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