Cla*_*diu 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的Number值相同,则返回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.

以下是它必须做的事情==:

  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的Number值相同,则返回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.

请注意,如果Type(x)等于Type(y)则操作符执行相同的操作.但是,如果它们不是,则==可能必须进行各种转换,而===只返回false.

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

但是,如果类型不同,请查看差异.当"hi" === {}你得到大约6600万运算/秒,但对"hi" == {}你来说只有大约400万运算/秒.

  • 我不认为这是个问题 (2认同)
  • *“`==` 与 `===` 有许多额外的步骤...”* 不一定。仅当类型不同时才是如此。 (2认同)

Dip*_*ole 6

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
Run Code Online (Sandbox Code Playgroud)

严格的平等操作员

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

""           ===   "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
Run Code Online (Sandbox Code Playgroud)

上述结果更加清晰,可以尽早破解代码.这会在一定程度上强化代码,并在操作数不同的情况下提供性能改进.

所以===在Javascript中比==快

这是很好的参考