为什么===在JavaScript中快于==?

时间:2013-09-27 02:51:52

标签: javascript performance

参见这些测试:

3 个答案:

答案 0 :(得分:18)

以下是javascript必须为===执行的操作:

  1. 如果Type(x)与Type(y)不同,则返回false。
  2. 如果Type(x)为Undefined,则返回true。
  3. 如果Type(x)为Null,则返回true。
  4. 如果Type(x)是Number,那么
    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都为true或两者都为false,则返回true;否则,返回false。
  7. 如果x和y引用同一个对象,则返回true。否则,返回false。
  8. 以下是==必须做的事情:

    1. 如果Type(x)与Type(y)相同,那么
      1. 如果Type(x)为Undefined,则返回true。
      2. 如果Type(x)为Null,则返回true。
      3. 如果Type(x)是Number,那么
        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)是String,则如果x和y完全相同的字符序列(相应位置的长度和字符相同),则返回true。否则,返回false。
      5. 如果Type(x)是布尔值,如果x和y都为true或两者都为false,则返回true。否则,返回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)是String而Type(y)是Number, 返回比较结果ToNumber(x)== y。
    6. 如果Type(x)是布尔值,则返回比较结果ToNumber(x)== y。
    7. 如果Type(y)是布尔值,则返回比较结果x == ToNumber(y)。
    8. 如果Type(x)是String或Number而Type(y)是Object, 返回比较结果x == ToPrimitive(y)。
    9. 如果Type(x)是Object而Type(y)是String或Number, 返回比较结果ToPrimitive(x)== y。
    10. 返回false。
    11. 请注意,如果Type(x)等于Type(y),则运算符执行相同的操作。但是,如果不是,那么==可能需要进行各种转换,而===只返回false。

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

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

答案 1 :(得分:5)

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

答案 2 :(得分:4)

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