JavaScript:表达式中非布尔值的隐式转换

时间:2018-08-04 00:07:02

标签: javascript boolean expression implicit-conversion

我的问题与以下三个链接有关(以下三个链接中的代码截屏和解释):

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)

我的问题有几个部分:

  1. (第一个代码框) var boo如何等于'world'而不是'hello'?根据第一张图片,两个值都应评估为true,那么为什么两个值都等于boo

  2. (第二个代码框)这比上一个更有意义。但是,为什么方程式的结果默认为方程式的true部分而不是false呢?

  3. (第三个代码框)现在,这非常令人困惑。我试图理解代码框下方的解释,但我无法弄清楚其原因。通过解释:

    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

4 个答案:

答案 0 :(得分:0)

  1. 变量boo取值为'world'而不是'hello'的原因是由于&&运算符。该运算符基本上说如果第一个值的值为true,则取第二个值

  2. &&运算符基本上相反,如果第一个值的取值为|| ,则false运算符取第二个值。 p>

  3. 测试相等性时,
  4. falsenull仍然是不同的值。即使它们都在布尔测试中被评估为false,这些值也不相同,并且相等性检查失败。测试相等性与测试truefalse的动作是不同的。您的解释的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)

好问题!

我的答案

  1. Logical AND (&&)可用于left to right完成的Short-circuit evaluation。如果存在,此逻辑运算符将返回 second 真实值。如果不返回,则返回false。

    -true &&(任何东西)短路评估为true但返回任何东西。

    -假&&(任何东西)被短路评估为假并返回假。

  2. 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。

  3. 第一行中的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并且类型无关紧要。

第三张图片现在应该更容易理解