3

在 if 语句中 JavaScript 将条件包装成布尔值是真的吗?

if(x) => if(Boolean(x))

在比较中,JavaScript 将比较元素包装成一个数字是真的吗?

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

3 回答 3

3

是的,不。

对于第一部分,的,这基本上就是 javascript 所做的。

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

Number('abc') // => NaN

并且 Not-A-Numbers 不相等:

NaN == NaN // => false

所以是这样的:

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

但这实际上是平等比较的。

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

作为旁注===,在 JavaScript中使用可能会更好,它还会检查被比较的值的类型:

0 == '0' // => true
0 === '0' // => false, because integer is not a string

更多细节===可以在这里阅读

于 2012-05-08T07:47:28.277 回答
1
  1. 是的,这是真的,x在这种情况下在布尔上下文中进行评估,因此Boolean(x)应用了等效项。

  2. 不,那不是真的。它看起来只是这样,因为强制相等运算符 ==试图将aand转换b为相同的类型。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.
于 2012-05-08T07:49:20.080 回答
1

在 if 语句中 JavaScript 将条件包装成布尔值是真的吗?

通常是的。

在比较中,JavaScript 将比较元素包装成一个数字是真的吗?

绝对没有。

解释

来自JavaScript 语言规范

if声明在第 12.5 节中定义为:

if ( 表达式 ) 语句 else 语句

它说表达式将被评估,转换,GetValue()然后在ToBoolean()转换后进行测试。

然后第一个断言为真(但见下文),if语句的条件被评估为作为参数传递给Boolean函数。请回想一下 JavaScript 如何处理类型转换为布尔值(第 9.2 节):

  • undefined并将null值转换为false.
  • 数字转换为falseif ±0NaN否则它们将转换为true.
  • 如果为空,则字符串将转换为false,否则始终转换为true无论其内容。
  • 对象总是转换为true.

因为调用GetValue()严格来说这个断言并不总是正确的,请看一下标准描述如何工作的第 8.7.1 节,这里可能会在调用之前GetValue()发生一些神奇的转换。ToBoolean()

运算符的==定义见第 11.9.3 节
正如您所看到的,它没有指定操作数必须是(或将被视为)数字,运算符的行为是不同的,并受一系列基于操作数类型的规则的约束。那么你的第二个断言是 false。它们是数字的情况(或其中一个是数字)只是算法中的一种特殊情况,请注意,在算法的第 4 点,它表示如果其中一个是数字而另一个是字符串然后它将被转换为ToNumber(),仅在这种情况下(具有此转换的所有含义)。

如果您认为可以比较函数、字符串或数字,这很直观,并非每种类型都可以转换为数值。

于 2012-05-08T08:08:35.397 回答