作者:mobiledu2502862177 | 来源:互联网 | 2023-02-01 11:48
我有以下代码片段:
if([]) {
console.log("first is true");
}
该console
说,first is true
该装置[]
是真实的。现在我想知道为什么:
if([] == true) {
console.log("second is true");
}
和这个:
if([] === true) {
console.log("third is true");
}
不是true
。如果控制台登录first is true
了第一个代码段,那意味着[]
应该为真,对吗?那么为什么后两个比较失败?这是小提琴。
1> Li357..:
这是根据规范。根据ECMAScript 2015语言规范,隐式强制转换为布尔值的任何对象均为true;这意味着物体是真实的。在if
语句内部,条件一旦被评估并且如果不是布尔值,就被强制为布尔值。因此,请执行以下操作:
if([]) {
...
}
[]
强制为布尔值时为true,并且为true。
另一方面,当您尝试使用抽象比较比较不同类型的两个值时==
,引擎必须在内部进行算法以将值减少为相似类型,最终将其简化为可以比较的整数。在规范的7.2.12节中,关于“抽象相等比较”的步骤x == y
,指出:
7.2.12抽象平等比较
比较x == y(其中x和y是值)产生true或false。这样的比较执行如下:
[...]
如果Type(y)为布尔型,则返回比较结果x == ToNumber(y)。
因此,y
操作数(在这种情况下为true
)通过强制转换为1,ToNumber
因为它是布尔值,并且[] == 1
是假的,因为:
如果Type(x)是Object并且Type(y)是String,Number或Symbol,则返回比较结果ToPrimitive(x)== y。
这将x
使用toString
数组的方法将操作数转换为字符串,""
在这种情况下,该方法适用于空数组。经过后ToPrimitive
,将导致:
if("" == 1) {
...
}
最后:
如果Type(x)是String且Type(y)是Number,则返回比较结果ToNumber(x)== y。
因此,ToNumber
一个空字符串""
为0,您将获得:
if(0 == 1) {
...
}
0不等于1,因此为假。请记住,仅仅因为某件事是真实的,并不等于真实。请尝试Symbol() == true
或({}) == true
。
最终比较with ===
是严格比较,并且不强制任何操作数,并且如果两个操作数不是同一类型,则将返回false。由于左操作数是一个对象(一个数组),而右操作数是一个数字,因此比较结果为false。