【问题标题】:Why === faster than == in JavaScript? [closed]为什么 === 在 JavaScript 中比 == 快? [关闭]
【发布时间】:2013-10-03 05:32:12
【问题描述】:

查看这些测试:

【问题讨论】:

标签: javascript performance


【解决方案1】:

这是 javascript 必须为 === 做的事情:

  1. 如果 Type(x) 与 Type(y) 不同,则返回 false。
  2. 如果 Type(x) 未定义,则返回 true。
  3. 如果 Type(x) 为 Null,则返回 true。
  4. 如果类型(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。
  5. 如果Type(x) 是String,那么如果x 和y 是完全相同的字符序列(相同长度和对应位置的相同字符),则返回true;否则,返回 false。
  6. 如果 Type(x) 是布尔值,如果 x 和 y 都为真或都为假,则返回真;否则,返回 false。
  7. 如果 x 和 y 引用同一个对象,则返回 true。否则,返回 false。

这就是它必须为== 做的事情:

  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。

请注意,如果Type(x) 等于Type(y),那么操作员会做同样的事情。但是,如果不是,那么 == 可能需要进行各种转换,而 === 只会返回 false。

对于您提供的链接,正在比较的类型实际上是相同的,因此两个运算符的性能应该大致相同。这里的差异将基于实现细节——因为它们做不同的事情,它们可以针对不同的方式进行优化。从理论上讲,由于=== 做得更少,人们会认为它总是会更快,但对于某些版本的 Firefox 似乎并非如此,至少如果这些基准是准确的。

但是,see the difference if the types are different。在执行"hi" === {} 时,您每秒可获得约 6600 万次操作,但对于 "hi" == {},您每秒只有约 400 万次操作。

【讨论】:

  • 我不认为这是问题
  • ===== 相比有许多额外的步骤...” 不一定。仅当类型不同时才会如此。
  • @captain 问题是什么?
  • @plalx 的问题是关于性能的。
  • @captain,我认为规范不言自明为什么== 可能比=== 慢。
【解决方案2】:

JavaScript 是一种弱类型语言,因此它会尽可能应用类型强制

等号运算符

// These are true
new Number(10) == 10; // Number.toString() is converted
                      // back to a number

10 == '10';           // Strings gets converted to Number
10 == '+10 ';         // More string madness
10 == '010';          // And more 
isNaN(null) == false; // null converts to 0
                      // which of course is not NaN

严格等式运算符

它的工作方式与普通的相等运算符类似,只是严格相等运算符不在其操作数之间执行类型强制。

""           ===   "0"           // false
0            ===   ""            // false
0            ===   "0"           // false
false        ===   "false"       // false
false        ===   "0"           // false
false        ===   undefined     // false
false        ===   null          // false
null         ===   undefined     // false
" \t\r\n"    ===   0             // false

上面的结果更加清晰,并且允许早期破坏代码。 这在一定程度上强化了代码,并且在操作数属于不同类型的情况下也提高了性能。

所以 === 比 JavaScript 中的 == 快

这里很好Reference

【讨论】:

    【解决方案3】:

    === 比较值和类型是否相同。
    == 比较值是否相同,但它也在比较中进行类型转换。这些类型转换使 == 比 === 慢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-05
      • 2013-03-08
      • 2012-06-14
      • 1970-01-01
      • 2012-03-29
      • 1970-01-01
      • 1970-01-01
      • 2012-11-30
      相关资源
      最近更新 更多