【问题标题】:Empty array is false, but in IF statement it returns true [duplicate]空数组为假,但在 IF 语句中它返回真 [重复]
【发布时间】:2013-02-20 20:05:13
【问题描述】:

这返回真:

[] == false

但是在这里,警报被称为:

if([]){ alert('empty array is true here'); }

你能解释一下原因吗?

【问题讨论】:

  • 受到您最近回答的问题的启发,嗯? :)
  • @dfsq 是的,你是对的:D
  • 好问题,但不要与两种情况下的比较内容混淆。检查@Kobi 提供的链接。
  • 类似:[1] == 1[[1]] == 1[1] != [[1]][1] != [1]
  • @Kobi 感谢您提供的链接,我正在阅读它

标签: javascript arrays


【解决方案1】:

根据ECMAScript® Language Specification中的section 11.9.3,任意==比较如下:

  1. 如果 Type(x) 与 Type(y) 相同,则
    1. 如果 Type(x) 未定义,则返回 true。
    2. 如果 Type(x) 为 Null,则返回 true。
    3. 如果类型(x)是数字,那么
      1. 如果 x 为 NaN,则返回 false。
      2. 如果 y 是 NaN,则返回 false。
      3. 如果 x 与 y 的数值相同,则返回 true。
      4. 如果 x 为 +0 且 y 为 -0,则返回 true。
      5. 如果 x 为 -0 且 y 为 +0,则返回 true。
      6. 返回 false。
    4. 如果 Type(x) 是字符串,则如果 x 和 y 是完全相同的字符序列(相同长度和对应位置的相同字符),则返回 true。否则,返回 false。
    5. 如果 Type(x) 是布尔值,如果 x 和 y 都为真或都为假,则返回真。否则,返回 false。
    6. 如果 x 和 y 引用同一个对象,则返回 true。否则,返回 false。
  2. 如果 x 为 null 而 y 未定义,则返回 true。
  3. 如果 x 未定义且 y 为 null,则返回 true。
  4. 如果 Type(x) 是 Number 并且 Type(y) 是 String, 返回比较结果 x == ToNumber(y)。
  5. 如果 Type(x) 是字符串并且 Type(y) 是数字, 返回比较结果 ToNumber(x) == y。
  6. 如果 Type(x) 是 Boolean,则返回比较结果 ToNumber(x) == y。
  7. 如果 Type(y) 为 Boolean,则返回比较结果 x == ToNumber(y)。
  8. 如果 Type(x) 是 String 或 Number 并且 Type(y) 是 Object, 返回比较结果 x == ToPrimitive(y)。
  9. 如果 Type(x) 是 Object 并且 Type(y) 是字符串或数字, 返回比较结果 ToPrimitive(x) == y。
  10. 返回 false。

在第一步中,ToNumber() 应用于false 并产生Number(0)。在第二步中,规则 #9 将 ToPrimitive() 应用于空数组并生成 "",将其转换为数值后,也将变为 Number(0)

另外,section 9.2 谈到在表达式中使用对象:

抽象操作ToBoolean根据下表将其参数转换为布尔类型的值:

  • 未定义 -> 错误
  • 空 -> 假
  • 布尔值 -> 结果等于输入参数(无转换)。
  • Number -> 如果参数为 +0、-0 或 NaN,则结果为假;否则结果为真。
  • String -> 如果参数是空字符串(其长度为零),则结果为假;否则结果为真。
  • 对象 -> 真

【讨论】:

    【解决方案2】:

    这是因为 JS 中的 == 强制转换,如果一种类型可以转换为另一种类型,则返回值是 true 而这里因为​​ [] 不能更改或与 bool 比较它是 false

    其中 if([]) 检查 nullundefined 值,因为 [] 既不是 null 也不是 undefined 它返回 true

    检查这个 Which equals operator (== vs ===) should be used in JavaScript comparisons?

    【讨论】:

    • "== 强制转换" 不完全正确;此外,if 不仅仅检查nullundefined
    猜你喜欢
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    • 2016-07-08
    • 2020-11-05
    相关资源
    最近更新 更多