为什么这些逻辑运算符返回一个对象而不是一个布尔值?
var _ = (obj.fn && obj.fn() ) || obj._ || ( obj._ = {} );
var _ = obj && obj._;
我想了解为什么它返回obj.fn()
(如果已定义) ORobj._
结果而不是布尔结果。
为什么这些逻辑运算符返回一个对象而不是一个布尔值?
var _ = (obj.fn && obj.fn() ) || obj._ || ( obj._ = {} );
var _ = obj && obj._;
我想了解为什么它返回obj.fn()
(如果已定义) ORobj._
结果而不是布尔结果。
在 JavaScript 中,||
和&&
都是逻辑短路运算符,当从左到右计算时,它们返回第一个完全确定的“逻辑值”。
在 expression 中X || Y
,X
首先计算,并解释为布尔值。如果此布尔值为“true”,则返回它。并且Y
不被评估。(因为Y
真假无所谓Y
,X || Y
已经完全确定了。)那就是短路部分。
如果这个布尔值是“假”,那么X || Y
在我们评估之前我们仍然不知道是真还是假Y
,并将其解释为一个布尔值。所以然后Y
被退回。
并&&
执行相同的操作,除了它停止评估第一个参数是否为假。
第一个棘手的部分是当表达式被评估为“真”时,然后返回表达式本身。这在逻辑表达式中算作“真”,但您也可以使用它。所以这就是您看到返回实际值的原因。
第二个棘手的部分是,当一个表达式被评估为“false”时,那么在 JS 1.0 和 1.1 中,系统将返回一个布尔值“false”;而在 JS 1.2 中,它返回表达式的实际值。
在 JSfalse
中0
,, -0
, ""
, null
, undefined
,NaN
和document.all
都算作 false。
在这里,我当然是为了讨论而引用逻辑值。当然,文字字符串"false"
与 value 不同false
,因此为真。
用最简单的话来说:
的||
运算符返回第一truthy值,并且如果没有一个是truthy,它返回最后一个值(这是一个falsy值)。
该&&
运算符返回第一个假值,如果没有一个假值,则返回最后一个值(这是一个真值)。
真的就是这么简单。在您的控制台中进行实验以亲自查看。
console.log("" && "Dog"); // ""
console.log("Cat" && "Dog"); // "Dog"
console.log("" || "Dog"); // "Dog"
console.log("Cat" || "Dog"); // "Cat"
var _ = ((obj.fn && obj.fn() ) || obj._ || ( obj._ == {/* something */}))? true: false
将返回布尔值。
更新
请注意,这是基于我的测试。我不应该被完全依赖。
它是一个不赋值true
或赋值的表达式false
。而是分配计算值。
让我们来看看这个表达式。
一个示例表达式:
var a = 1 || 2;
// a = 1
// it's because a will take the value (which is not null) from left
var a = 0 || 2;
// so for this a=2; //its because the closest is 2 (which is not null)
var a = 0 || 2 || 1; //here also a = 2;
你的表情:
var _ = (obj.fn && obj.fn() ) || obj._ || ( obj._ = {} );
// _ = closest of the expression which is not null
// in your case it must be (obj.fn && obj.fn())
// so you are gettig this
另一种表达:
var a = 1 && 2;
// a = 2
var a = 1 && 2 && 3;
// a = 3 //for && operator it will take the fartest value
// as long as every expression is true
var a = 0 && 2 && 3;
// a = 0
另一种表达:
var _ = obj && obj._;
// _ = obj._
在大多数编程语言中,&&
和||
运算符返回布尔值。在 JavaScript 中则不同。
或运算符:
它返回第一个验证为真(如果有)的操作数的值,否则返回最后一个操作数的值(即使它验证为假)。
示例 1:
var a = 0 || 1 || 2 || 3;
^ ^ ^ ^
f t t t
^
first operand that validates as true
so, a = 1
示例 2:
var a = 0 || false || null || '';
^ ^ ^ ^
f f f f
^
no operand validates as true,
so, a = ''
AND 运算符:
它返回最后一个验证为真的操作数的值(如果所有条件都验证为真),否则返回第一个验证为 false 的操作数的值。
示例 1:
var a = 1 && 2 && 3 && 4;
^ ^ ^ ^
t t t t
^
last operand that validates as true
so, a = 4
示例 2:
var a = 2 && '' && 3 && null;
^ ^ ^ ^
t f t f
^
return first operand that validates as false,
so, a = ''
结论:
如果您希望 JavaScript 以与其他编程语言相同的方式工作,请使用Boolean()
函数,如下所示:
var a = Boolean(1 || 2 || 3);// a = true