任何想法为什么它的行为如此?具有空元素的有趣数组JavaScript行为
回答
当==
用来比较不同类型的东西,像一个数组([null]
)和false
,它有它通过具体步骤,称为Abstract Equality Algorithm(以下引用),试图强迫他们的东西,它可以比较。 (因为==
是“松散的”相等操作。)
首先它看到如果操作数是null
或undefined
,但在这种情况下也不是。
然后看看它是否比较数字和字符串,但在这种情况下也不是这样。
然后,看起来如果两个操作数是布尔值,当然这些是。由于其中一个是布尔型的,因此它在规范中执行一个名为ToNumber
的抽象操作,将另一个转换为数字并执行另一个操作==
。 (该Number
功能,作为一个功能,而不是一个构造函数中使用时,基本上是抽象ToNumber
操作的包装。)
所以
[null] == false
成为
0 == false
...因为ToNumber([null])
将其参数强制转换为字符串(通过ToPrimitive
),得到""
,然后将其转换为0
。
所以现在==
有一些操作数是一个数字。所以它将其他也转换为数字。 Number(false)
是0
。因此,[null] == false
是正确的。
那么[null, null] == false
呢?当将[null, null]
转换为字符串时,我们得到","
,其中ToNumber
无法变成有效数字。所以它将它转换为NaN
。 NaN
有趣的事情之一是它是一个数字,但它永远不会等于其他任何东西。所以:
[null, null] == false
成为
NaN == false
成为
NaN == 0
...这是false
,因为(再次)NaN
永远无所不能。
以下是摘要平等算法:
- ReturnIfAbrupt(
x
)。 - ReturnIfAbrupt(
y
)。 如果Type(
x
)是相同的类型(y
),然后一个)返回执行严格相等比较
x
===y
的结果。如果
x
是null
和y
是undefined
,返回true
。- 如果
x
是undefined
和y
是null
,返回true
。 - 如果Type(
x
)是数目和类型(y
)是字符串,返回
比较x
== ToNumber(y
)的结果。 - 如果Type(
x
)是字符串和类型(y
)是Number,
回到比较ToNumber(x
)==y
的结果。 - 如果Type(
x
)是布尔值,返回的比较 ToNumber(x
)==y
的结果。 - 如果Type(
y
)是布尔值,返回的比较x
== ToNumber(y
)的结果。 - 如果Type(
x
)或者是字符串,数字,或符号和类型(y
)是Object,然后返回
比较x
== ToPrimitive(y
)的结果。 - 如果Type(
x
)是Object和类型(y
)或者是字符串,数字,或符号,然后返回
比较ToPrimitive(x
)==y
的结果。 - 返回
false
。
https:// stackoverflow。com/questions/5491605/empty-arrays-seem-to-the-same-true-and-false-at-the-the-time- 这是JS ==比较的一个很好的参考,特别是与数组 – Matt
- 1. JavaScript/jQuery悬停函数行为有趣 - 数组问题?
- 2. 具有0个元素的数组
- 3. 数组有多少个元素不为空或为空?
- 4. 带有单个元素的数组Javascript
- 5. 在javascript中计算具有特定日期的数组元素
- 6. Javascript/jquery从具有相同rel的元素创建数组?
- 7. 检查数组是否有空元素
- 8. 检查哪些数组元素具有空值
- 9. 具有名称空间的Xml元素
- 10. 来自具有某个类名的所有元素的Javascript数组
- 11. 有趣的LinqToSql行为
- 12. 有趣的bash行为
- 13. 如何在具有行元素的数组中使用EventListener
- 14. 将数组拆分为s个具有uniq元素的子集
- 15. 将组划分为具有相同元素数量的子集
- 16. 有趣的UITableView数据源行为
- 17. 向现有的javascript数组添加数组元素
- 18. 动态分配数组的有趣行为
- 19. 对所有元素的元组数组进行排序
- 20. 具有rtl方向的pre元素中的后缀空白的奇怪行为?
- 21. 数组到对象和数组在PHP中的对象 - 有趣的行为
- 22. 如何将数组中具有相同属性值的元素作为元素推送到新数组中?
- 23. 正在创建具有可变数量元素的数组吗?
- 24. 查找具有最大和最小元素数的数组
- 25. xslt - 找到所有具有未知命名空间的元素
- 26. Javascript有趣的测试RegExp
- 27. Javascript上有趣的怪癖
- 28. jQuery的nextUntil具有元素
- 29. 查找具有元素数量的行数/列数
- 30. 为什么我的对象数组中的所有元素都为空?
'!!测试' – tymeJV
用'=='比较数组与非数组几乎没有实际用途,除非您认为这种娱乐或您喜欢在ECMAScript规范中研究类型转换规则的复杂性。这是什么意思? – jfriend00
这已被问了几次。寻找真相和虚假。 'if(非null,空字符串,0)'总是返回true。至于其他,看看test.toString()返回什么,你会看到为什么[null] == false是true,[null,null] == false是false – mplungjan