具有以下测试用例:(找小提琴here)
var a = new Date();
var b = null;
var c = {test: "test"};
if(a)
console.log(a); //--- prints the current date
if(b)
console.log('null'); //--- never reached
if(c)
console.log('test'); //--- prints 'test'
console.log(a && b); //--- prints null
知道
console.log(typeof null); //--- prints "object"
console.log(typeof c); //--- prints "object"
我期待
的结果console.log(a && b);
是 false ,而不是 null ,如示例中所示。
任何提示?
答案 0 :(得分:4)
答案 1 :(得分:1)
我期待
的结果console.log(a && b);
是示例中显示的
false
而不是null
。
在使用&&
和||
运算符(或AND
和OR
)的多种语言中,结果始终为布尔值,是。*但是JavaScript {{1} }和&&
比这更有用:它们的结果是左手操作数的值或右手操作数的值,不强制转换为布尔值。
以下是||
的工作原理:
评估左手操作数。
如果值为 falsey (当我们将其设为布尔值时强制转换为&&
),则返回值(不是强制值)
如果#2中的值为 truthy ,请评估并返回右侧值(未强制)
falsey 值为false
,null
,undefined
,0
,""
,当然还有{{ 1}}。其他一切都是 truthy 。
例如
NaN
...显示false
,因为console.log(0 && 'hi'); // 0
是假的。请注意,结果是0
,而不是0
。同样,结果如下:
0
...是false
,因为console.log(1 && 'hello'); // hello
根本没有强制执行右侧。
'hello'
的工作方式类似(我称之为curiously-powerful OR operator):它评估左侧,如果是 truthy ,则将其作为结果;否则它会评估右侧并将 作为结果。
唯一一次从&&
或||
获取true
或false
,如果所选操作数已布尔值。
*当然,许多(但不是全部)这些语言(Java,C#)也要求&&
和||
的操作数已经是布尔值。 C是一个例外,它做了一些强制,但仍然将操作数的结果作为布尔值(或者如果你回到足够远的地方,一个int将是1或0)。
答案 2 :(得分:0)
来自MDN:
逻辑AND(&& amp;)expr1&& expr2如果可以转换,则返回expr1 为假;否则,返回expr2。因此,当与布尔一起使用时 价值观,&&如果两个操作数都为真,则返回true;否则,返回 假的。