【问题标题】:Javascript typecast paradox [duplicate]Javascript类型转换悖论[重复]
【发布时间】:2016-02-28 12:41:24
【问题描述】:

谁能解释一下,为什么! 和== 将[] 的类型转换为布尔值:

![] // false

!0 // true

[] == 0 // true

!0 == ![] // false

同样的悖论:

0 == Boolean ([]) // false

[] == false // true

Boolean([]) // true

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

【问题讨论】:

  • 更糟糕的是——[] == [] 也是false! :P
  • @Boaz 没什么神奇的[] == []。对象通过引用进行比较,由于[] 和[] 创建了2 个不同的数组,所以它是false。
  • 就像这里所有其他询问== 的看似奇怪行为的问题一样,您会发现== 不是转换为布尔值,而是使用称为抽象相等比较算法的更复杂的算法来转换类型直到它们匹配。
  • ...就目前而言,我真的不知道你在问什么,因为我不知道你的期望是什么。您问题中的所有结果对我来说都是有意义的。
  • @EduardFlorinescu:首先,不要做傻事。我从未声称完全了解 JS,也不需要为了理解这些基础知识。其次,你没有解释为什么你认为结果应该不同。第三,这些行为被很好地记录了很多次。您不会得到与其他数百个正确答案不同的答案。第四,不要做傻事。

标签: javascript


【解决方案1】:

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 == Boolean ([])
如前所述,转换为布尔值的对象始终为真,0 为假。 0 == Boolean ([]) -> 0 == true -> 0 == 1 -> false

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 2021-07-20
    • 1970-01-01
    相关资源
    最近更新 更多