我的问题与以下三个链接有关(以下三个链接中的代码截屏和解释):
List of values which, when converted to boolean, are evaluated as false
First and Second code boxes (see below)
Third code box and explanation (see below)
我的问题有几个部分:
(第一个代码框) var boo
如何等于'world'
而不是'hello'
?根据第一张图片,两个值都应评估为true
,那么为什么两个值都等于boo
?
(第二个代码框)这比上一个更有意义。但是,为什么方程式的结果默认为方程式的true
部分而不是false
呢?
(第三个代码框)现在,这非常令人困惑。我试图理解代码框下方的解释,但我无法弄清楚其原因。通过解释:
a。第一行中的myNumber = false
:这部分很有意义,因为由于逻辑运算符"1"
而将值!
转换为布尔值,从而使其变为:{{1 }}。因此,true
用布尔值表示:!1
(不是真的),这是错误的。
b。 !true
,因为它等于myNumber !=== null
。这就是令人困惑的地方。 false
不能等于null
的唯一方法是,如果false
不是此特定代码行中的值(请参阅第一个链接,其中它在列表的null
中列出了null
值评估为false
)。在解释中,它表示“在if语句的第3行,false并不等于null。” 看来这是矛盾的。
c。 myNumber === false
,因此其值为2
。在这里,它再次为变量提供true
的值,而不仅仅是说变量为false
(“再次”是对链接#2-第二代码框的引用)为什么那?
谢谢您的帮助!
betheymc
答案 0 :(得分:0)
变量boo
取值为'world'
而不是'hello'
的原因是由于&&
运算符。该运算符基本上说如果第一个值的值为true
,则取第二个值。
与&&
运算符基本上相反,如果第一个值的取值为||
,则false
运算符取第二个值。 p>
false
和null
仍然是不同的值。即使它们都在布尔测试中被评估为false
,这些值也不相同,并且相等性检查失败。测试相等性与测试true
或false
的动作是不同的。您的解释的c
部分回到了第二个问题的答案,其中||
取第二个值,因为第一个值的值为false
。
我希望这些可以帮助您阐明一些问题。
答案 1 :(得分:0)
您需要了解&&
和||
运算符的作用。它们之所以称为布尔运算符,是因为它们对输入的布尔值进行运算,但是由于Javascript是动态类型化的,因此不修改实际值。这很重要,因为返回原始输入值要比返回布尔值更好,因为它们都将求值为相同的布尔值,但是如果运算符将输入转换为布尔输出,则会丢失信息。
1)var boo = 'hello' && 'world'
&&
(和)运算符的逻辑是求出第一个输入,如果它求值为false
,则返回它,否则返回第二个值。就是这样,就是合同。
在这种情况下,由于'hello'
为true,因此它立即返回'world'
。
2)var boo2 = (0/0) || 43.2
||
(和)运算符的逻辑与&&
(和)运算符的逻辑相反,如果该输入为 true ,它将评估第一个输入,然后返回它,否则返回第二个值。
如您所见,(0/0)
的计算结果为false,因此它立即返回第二个值。
3)
1| var myNumber = !1;
2|
3| if (myNumber == null) {
4| myNumber = 3
5| }
6|
7| myNumber = myNumber || 2
这里的问题仍然是了解运算符的作用,==
等式运算符不是布尔运算符,因此在进行比较之前它不会将输入评估为布尔值。因此,在第3行上,您实际上是在询问布尔值false
是否等于null
对象。在这种情况下,不是。
最后,对于myNumber = myNumber || 2
行,只需参考我上面关于||
(或)运算符的操作的注释,它将有意义。
注意:如果您希望将这些表达式评估为布尔值,则可以使用以下语法将它们转换为布尔值:
var boo = !!('hello' && 'world');
'!'取反表达式并将其转换为布尔值,再次取反将为其提供正确的值。
答案 2 :(得分:0)
好问题!
我的答案
Logical AND (&&)可用于left to right
完成的Short-circuit evaluation。如果存在,此逻辑运算符将返回 second 真实值。如果不返回,则返回false。
-true &&(任何东西)短路评估为true但返回任何东西。
-假&&(任何东西)被短路评估为假并返回假。
Logical OR (||)也可用于Short-circuit evaluation,该操作如left to right
所述。该逻辑运算符返回 first 真实值。
-var foo ='Cat'|| 'Dog'// = >>>>> foo =“ Cat”
-var foo2 ='Cat'|| false'// = >>>>> foo2 =“猫”
-var foo3 =''|| false // = >>>>> foo3 = false
var boo2 =(0/0)||的原因43.2返回43.2 是因为(0/0)被评估为NaN,在这种情况下,第一个真实值将是43.2。
第一行中的myNumber不为真,换句话说为false。比第三行将myNumber的当前值与null进行比较。然后,因为 null不为false且类型不相等,所以不会执行if语句,并且代码将继续执行直到第7行。在第7行中发生了答案2中解释的事情。
var boo = !1
console.log('var boo with value ', boo + ' is a ', typeof(boo))
console.log('Null is an ', typeof(null), ' but false is a ', typeof(!true))
console.log(typeof(false || true) == typeof(null)) // types are not equal
console.log(!true == null) // so they are not equal
逻辑规则保证这些评估总是正确的。请注意,以上表达式的任何内容均未评估,因此这样做的任何副作用均不会生效。另外,请注意,上述表达式的任何部分都是任何单个逻辑表达式(如括号所示)。
答案 3 :(得分:0)
这是因为第一张图片有误。
null不能比较等于true或false,只能隐式比较等于undefined
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/null
继续前进
let foo = A && B
// the above is the same to the one below
function fooFunction(a, b){
if(!a)
return a
else
return b
}
foo将是A的值。如果可以将A强制转换为false ;否则,它将是B并且类型无关紧要。
let fooA = '' && 'abc' //''
let fooB = 'something' && 'abc' //'abc'
fooA将为”,因为第一个值被强制为false,而fooB将注意到第一个值不能被强制为false,然后将第二个值分配为“ abc”
与||
let foo = A || B
foo将是A的值。如果可以将A强制为true ;否则,它将是B并且类型无关紧要。
第三张图片现在应该更容易理解