在 if 语句中 JavaScript 将条件包装成布尔值是真的吗?
if(x) => if(Boolean(x))
在比较中,JavaScript 将比较元素包装成一个数字是真的吗?
a == b => Number(a) == Number(b)
在 if 语句中 JavaScript 将条件包装成布尔值是真的吗?
if(x) => if(Boolean(x))
在比较中,JavaScript 将比较元素包装成一个数字是真的吗?
a == b => Number(a) == Number(b)
是的,不。
对于第一部分,是的,这基本上就是 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
更多细节===
可以在这里阅读。
是的,这是真的,x
在这种情况下在布尔上下文中进行评估,因此Boolean(x)
应用了等效项。
不,那不是真的。它看起来只是这样,因为强制相等运算符 ==
试图将a
and转换b
为相同的类型。Number()
仅当其中一个a
或b
已经是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.
在 if 语句中 JavaScript 将条件包装成布尔值是真的吗?
通常是的。
在比较中,JavaScript 将比较元素包装成一个数字是真的吗?
绝对没有。
该if
声明在第 12.5 节中定义为:
if ( 表达式 ) 语句 else 语句
它说表达式将被评估,转换,GetValue()
然后在ToBoolean()
转换后进行测试。
然后第一个断言为真(但见下文),if
语句的条件被评估为作为参数传递给Boolean
函数。请回想一下 JavaScript 如何处理类型转换为布尔值(第 9.2 节):
undefined
并将null
值转换为false
.false
if ±0NaN
否则它们将转换为true
.false
,否则始终转换为true
无论其内容。true
.因为调用GetValue()
严格来说这个断言并不总是正确的,请看一下标准描述如何工作的第 8.7.1 节,这里可能会在调用之前GetValue()
发生一些神奇的转换。ToBoolean()
运算符的==
定义见第 11.9.3 节。
正如您所看到的,它没有指定操作数必须是(或将被视为)数字,运算符的行为是不同的,并受一系列基于操作数类型的规则的约束。那么你的第二个断言是 false。它们是数字的情况(或其中一个是数字)只是算法中的一种特殊情况,请注意,在算法的第 4 点,它表示如果其中一个是数字而另一个是字符串然后它将被转换为ToNumber()
,仅在这种情况下(具有此转换的所有含义)。
如果您认为可以比较函数、字符串或数字,这很直观,并非每种类型都可以转换为数值。