Javascript 类型转换悖论

标签 javascript

有人可以解释一下为什么 !==搞乱了 [] 的类型转换 bool 值:

![] // false

!0 // true

[] == 0 // true

!0 == ![] // false

同样的悖论:

0 == Boolean ([]) // false

[] == false // true

Boolean([]) // true

[] == Boolean([]) // false

最佳答案

1) ![]
任何对象实例(包括[])都是真值。 ![] -> !true -> false

2) !0
0 是虚假值。 !0 -> !false -> true

3) [] == 0
当将对象与原始值(在本例中为另一个数字)进行比较时,该对象也会转换为原始值。 [] == 0 -> 0 == 0 -> true

4) !0 == ![]
!0 == ![] -> !false == ![] -> true == ![] -> true == !true -> true == false -> false

5) 0 == bool 值 ([])
如前所述,对象转换为 bool 值时始终为 true,而 0 为 false。 0 == Boolean ([]) -> 0 == true -> 0 == 1 -> false

6) [] == false
[] == false -> [] == 0 -> 0 == 0 -> true

7) bool 值([])
对象引用始终为 true。 bool 值([]) -> true

8) [] == Boolean([])
[] == Boolean([]) -> [] == true -> [] == 1 -> 0 == 1 ->

检查this interesting post关于比较和类型转换。

关于Javascript 类型转换悖论,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35605858/

相关文章:

javascript - 使用 Javascript 在 Firefox 中打印 PDF

javascript - 如何避免由于 React-Native 中未定义而出现错误

javascript - JavaScript 中的按位运算符作为状态标志

javascript - 将数组分成两部分

javascript - 在 D3 中使用投影进行动态简化

javascript - 避免使用 jquery 多次选择相同的选项

javascript - array.forEach 的奇怪行为

javascript - 使用 PhantomJS 下载动态网页内容时遇到问题

javascript - JS Promises - 为什么我会看到 UnhandledPromiseRejectionWarning 和 DeprecationWarning?

c# - 在单独的项目中共享 javascript 文件