JavaScript中的if语句 vs. 比较操作

3
在if语句中,JavaScript会将条件包装成布尔值,这是真的吗?
if(x) => if(Boolean(x))

相比之下,JavaScript会将比较元素包装成数字吗?

a == b => Number(a) == Number(b)

MDN:比较运算符:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/%E6%AF%94%E8%BE%83%E8%BF%90%E7%AE%97%E7%AC%A6 - Andrew D.
3个回答

3

可以,也可以不可以。

对于前半部分,可以,这基本上是javascript所做的事情。

但对于后者,不行。并非javascript中的所有内容都可以转换为数字。例如:

Number('abc') // => NaN

并且非数字不相等:

NaN == NaN // => false

所以大概是这样:

Number('abc') == Number('abc') // => false!

但这实际上也适用于相等比较。

'abc' == 'abc' // => true

作为一种注意事项,JavaScript 最好使用 ===,这样可以检查被比较的值的类型。
0 == '0' // => true
0 === '0' // => false, because integer is not a string

关于===的更多细节可以在这里阅读。


1
  1. 是的,这是真的,在这种情况下,x在布尔上下文中被评估,因此应用了Boolean(x)的等效形式。

  2. 不,这不是真的。它只是看起来像这样,因为强制相等运算符==尝试将ab转换为相同的类型。Number()仅在ab已经是Number时才会应用。例如:


>>> 0x2A == 42
true   // both 'a' and 'b' are numbers.

>>> "0x2A" == 42
true   // 'a' is a string whose number coercion is equal to 'b'.

>>> "0x2A" == "42"
false  // 'a' and 'b' are different strings.

1
如果a或b是布尔值怎么办?例如,a = true。 - DuduAlul
如果另一个操作数是数字,布尔值也会被转换为数字(true == 1false == 0)。 - Frédéric Hamidi

1
在 JavaScript 的 if 语句中,将条件包装成布尔值是真的吗?
通常是的。
在 JavaScript 的比较操作中,将比较元素包装成数字是真的吗?
绝对不是。
说明
来自 JavaScript 语言规范链接1。
在第12.5节中定义了 if 语句:
if ( Expression ) Statement else Statement
它指出 Expression 将被求值,并使用 GetValue() 转换后,在 ToBoolean() 转换后进行测试。
然后第一个断言是正确的(但稍后再看),if 语句的条件会像传递给 Boolean 函数的参数一样被评估。请回想一下 JavaScript 如何处理类型转换为布尔值(§9.2):
  • undefinednull值被转换为false
  • 如果是±0或NaN,则数字将被转换为false,否则将被转换为true
  • 如果为空,则字符串将被转换为false,否则无论其内容如何,始终转换为true
  • 对象始终被转换为true

由于调用了GetValue(),严格来说这个断言并不总是成立,请参阅§ 8.7.1,其中标准描述了GetValue()的工作方式,在ToBoolean()被调用之前可能会发生一些魔法转换。

== 运算符的定义在§ 11.9.3中。正如您所看到的,它并没有指定操作数必须是数字(或将被视为数字),运算符的行为是不同的,并且受一系列基于操作数类型的规则所调节。因此,您的第二个断言是错误的。当它们是数字(或其中一个是数字)时,只是算法中的一个特殊情况,请注意,在算法的第4点中,它说如果其中一个是数字,而另一个是字符串,则会使用ToNumber()进行转换,仅在这种情况下(具有此转换的所有含义)。
如果您认为可以比较函数、字符串或数字,那么这是直观的,但并非每种类型都可以转换为数字值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接