the*_*ist 48 javascript logical-operators
为什么这些逻辑运算符返回一个对象而不是布尔值?
var _ = (obj.fn && obj.fn() ) || obj._ || ( obj._ = {} );
var _ = obj && obj._;
Run Code Online (Sandbox Code Playgroud)
我想理解为什么它返回obj.fn()(如果已定义)OR的obj._结果,但不返回布尔结果.
Dra*_*ord 66
在JavaScript中,两个||和&&是逻辑短路运营商从左至右评价时返回第一个完全确定的"逻辑值".
在表达式中X || Y,X首先进行求值,并将其解释为布尔值.如果此布尔值为"true",则返回该值.而且Y没有评估.(因为无论Y是真还是Y假都没关系,X || Y已经完全确定了.)那就是短路部分.
如果这个布尔值是"假",那么X || Y在我们评估之前,我们仍然不知道是真还是假Y,并将其解释为布尔值.然后Y返回.
并且&&相同,除了它停止评估第一个参数是否为假.
第一个棘手的部分是,当表达式被评估为"true"时,表达式本身就会被返回.在逻辑表达式中计为"true",但您也可以使用它.所以这就是你看到返回实际值的原因.
第二个棘手的部分是,当一个表达式被评估为"false"时,那么在JS 1.0和1.1中,系统将返回一个布尔值"false"; 而在JS 1.2中,它返回表达式的实际值.
在JS false,0,-0,"",null,undefined,NaN和document.all所有的算假的.
在这里,我当然引用逻辑值进行讨论.当然,文字字符串"false"与值不同false,因此是正确的.
Sam*_*ton 61
用最简单的术语来说:
的||运算符返回第一truthy值,并且如果没有一个是truthy,它返回最后一个值(这是一个falsy值).
该&&运算符返回第一falsy值,如果没有一个是falsy,它返回的最后一个值(这是一个truthy值).
这真的很简单.在您的控制台中进行实验,亲眼看看.
"" && "Dog" // ""
"Cat" && "Dog" // "Dog"
"" || "Dog" // "Dog"
"Cat" || "Dog" // "Cat"Run Code Online (Sandbox Code Playgroud)
San*_*kha 19
var _ = ((obj.fn && obj.fn() ) || obj._ || ( obj._ == {/* something */}))? true: false
Run Code Online (Sandbox Code Playgroud)
将返回布尔值.
UPDATE
请注意,这是基于我的测试.我不能完全依赖.
它是一个不分配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;
Run Code Online (Sandbox Code Playgroud)
你的表达:
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
Run Code Online (Sandbox Code Playgroud)
另一个表达:
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
Run Code Online (Sandbox Code Playgroud)
另一个表达:
var _ = obj && obj._;
// _ = obj._
Run Code Online (Sandbox Code Playgroud)
在大多数编程语言中,&&和||运算符返回布尔值。在 JavaScript 中则不同。
或运算符:
它返回的值,第一个操作数,用于验证为真(如果有的话),否则返回的值最后一个操作数(即使它证明为假)。
示例 1:
var a = 0 || 1 || 2 || 3;
^ ^ ^ ^
f t t t
^
first operand that validates as true
so, a = 1
Run Code Online (Sandbox Code Playgroud)
示例 2:
var a = 0 || false || null || '';
^ ^ ^ ^
f f f f
^
no operand validates as true,
so, a = ''
Run Code Online (Sandbox Code Playgroud)
AND 运算符:
它返回最后一个验证为真的操作数的值(如果所有条件都验证为真),否则返回第一个验证为 false 的操作数的值。
示例 1:
var a = 1 && 2 && 3 && 4;
^ ^ ^ ^
t t t t
^
last operand that validates as true
so, a = 4
Run Code Online (Sandbox Code Playgroud)
示例 2:
var a = 2 && '' && 3 && null;
^ ^ ^ ^
t f t f
^
return first operand that validates as false,
so, a = ''
Run Code Online (Sandbox Code Playgroud)
结论:
如果您希望 JavaScript 以与其他编程语言相同的方式工作,请使用Boolean()函数,如下所示:
var a = Boolean(1 || 2 || 3);// a = true
Run Code Online (Sandbox Code Playgroud)
您应该将短路运算符视为条件而不是逻辑运算符。
x || y 大致对应于:
if ( x ) { return x; } else { return y; }
Run Code Online (Sandbox Code Playgroud)
并x && y大致对应于:
if ( x ) { return y; } else { return x; }
Run Code Online (Sandbox Code Playgroud)
鉴于此,结果是完全可以理解的。
来自MDN 文档:
逻辑运算符通常与布尔(逻辑)值一起使用。当它们是时,它们返回一个布尔值。然而,&& 和 || 运算符实际上返回指定操作数之一的值,因此如果这些运算符与非布尔值一起使用,它们将返回一个非布尔值。
而这里的表与所有逻辑运算符的返回值。
| 归档时间: |
|
| 查看次数: |
19422 次 |
| 最近记录: |