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

JavaScript: Implicit conversions of non boolean values in expressions

我的问题与三个link有关(以下3link中的代码截图和解释):

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. (2nd code box) 这比上一个更有意义。但是,为什么等式的结果默认为等式的 true 部分而不是 false?

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

    一个。第一行中的 myNumber = false:这部分是有意义的,因为值 "1",因为逻辑运算符 !,被转换为布尔值,这使得它变成:true.因此,!1 在布尔值中的意思是:!true(不正确),这是错误的。

    b。 myNumber !=== null,因为它等于 false。这就是令人困惑的地方。 null 不能等于 false 的唯一方法是如果 null 不是此特定代码行中的值(首先参见 link 列出的 null在评估为 false 的值列表中)。解释里面说"In the if statement, at line 3, false does not equal null."好像自相矛盾

    c。 myNumber === false,因此它被赋值2。这里它再次给变量​​ true 值,而不是仅仅说变量是 false ("again" 是对 link #2 的引用 - 第二个代码box)这是为什么?

提前感谢您的帮助!

贝西麦克

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

  2. 本质上与 && 运算符相反,如果第一个值的计算结果为 false[,|| 运算符 将采用第二个值=40=].

  3. falsenull 在测试相等性时仍然是不同的值。尽管在布尔测试中它们都被评估为 false,但这些值不同并且相等性检查失败。测试相等性与测试 truefalse 是不同的操作。您解释的 c 部分可以追溯到第二个问题的答案,其中 || 运算符采用第二个值,因为第一个值的计算结果为 false.

我希望这些可以帮助阐明您的问题。

您需要了解 &&|| 运算符的作用。它们被称为布尔运算符,因为它们对输入的布尔值进行运算,但不修改实际值,因为 Javascript 是动态类型的。这很重要,因为 returning 原始输入值比 returning 布尔值更好,因为它们都将评估为相同的布尔值,但如果运算符转换了,您将丢失信息输入到布尔输出。

1) var boo = 'hello' && 'world'

&&(与)运算符的逻辑是对第一个输入进行求值,如果求值为false,则return,否则return第二个值。就是这样,就是合同。

在这种情况下,由于 'hello' 为真,它立即 returns 'world'

2) var boo2 = (0/0) || 43.2

||(或)运算符的逻辑与 &&(和)运算符相反,因为它计算第一个输入,如果该输入为 true ,然后 return 它,否则 return 第二个值。

正如您所见,(0/0) 的计算结果为 false,因此它立即 return 成为第二个值。

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');

'!'取反表达式并将其转换为布尔值,再次取反为其提供正确的值。

好问题!

我的回答

  1. 完成left to rightLogical AND (&&) could be used for a Short-circuit evaluation。此逻辑运算符 return 是 second 真值(如果存在)。如果不只是 return false.

    - true &&(任何值)短路评估为 true 但 returns 任何值。

    - false &&(任何东西)被短路评估为 false 并且 returns false。

  2. left to right所述的Logical OR (||) could be used too for a Short-circuit evaluation。此逻辑运算符 return 是 第一个 真值。

    - var foo = 'Cat' || 'Dog' // =>>>>> foo = "Cat"

    - var foo2 = 'Cat' || false ' // =>>>>> foo2 = "Cat"

    - var foo3 = '' || false // =>>>>> foo3 = false

    之所以var boo2 = (0/0) || 43.2 return 43.2 是因为 (0/0) 被评估为 NaN 并且在这种情况下第一个真实值将是 43.2.

  3. 第一行中的 myNumber 不是 true,换句话说是 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

逻辑规则保证这些评估总是正确的。请注意,不会评估上述表达式的任何部分,因此这样做的任何副作用都不会生效。另外,请注意上面表达式的任何部分是任何单个逻辑表达式(如括号所示)。

因为第一张图画错了

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 可以被强制为真;否则,它将是 B,类型无关紧要。

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