回答

收藏

在 JavaScript 比较中应该使用哪个等于运算符 (== vs ===)?

技术问答 技术问答 245 人阅读 | 0 人回复 | 2023-09-11

我正在使用JSLint来检查 JavaScript,并且在执行语句内部比较等操作时,会返回很多建议==(两个等号)替换===(三个等号)。idSele_UNVEHtype.value.length == 0``if& F8 H! m& X- o1 [% \4 [
是否有性能优势取代==用===?5 [( m% c. Q; @+ K6 A/ d+ @; b
任何性能改进都会受到欢迎,因为多而受欢迎。
9 {+ a5 k7 H* m1 i. {) H* N如果没有类型转换,性能会比较吗?==?3 {5 \9 x  S( _/ ]
                                                                ) |* [# w% \2 G3 q
    解决方案:                                                                9 D" q2 D( Y9 k& `3 {
                                                                除类型转换外,严格相等运算符 ( ===) 行为等于抽象运算符 ( ==) 相同的类型必须相同才能被视为相等。
! A8 X$ d. C! ^" ^* v( p该==运营商将相对平等转换任何必要的类型后。该===运营商将不会因此,如果两个值是不同类型的===简单返回false。两者都一样快。
4 M3 Z  K8 b/ {) iJavaScript 有两组相等运算符:===and !==,以及他们邪恶的双胞胎==and !=。一个好的方法将以你期望的方式工作。如果两个操作数的类型和值相同,则===产生true和!==产生false。当操作数是相同类型时,邪恶双胞胎会做正确的事情,但如果它们是不同类型,它们会尝试强制转换值。他们这样做的规则既复杂又难以记住。这些是一些有趣的案例:
0 ^8 x: D" V$ R9 Z```js1 c/ j3 Z! E' h# m
‘’ == ‘0’      false# Y2 [! r  H8 R: c; R- t& i' m  `
0 == ‘’       true# `. m3 b* k, U+ D
0 == ‘0’       true
  x" |0 N( y! [+ _, C1 E/ i7 ~false == ‘false’    // false
+ X( G# H  ~, ~" \" t, [8 vfalse == ‘0’     true+ [1 @/ `7 y5 A1 h  F
false == undefined  // false( s: |  T, f2 f
false == null    false( @' a1 j$ }# p1 c" r8 M% h/ G
null == undefined   // true
  N$ Z, Y" k: H; x; X3 K, @# v‘ \t\r\n ‘ ==   true8 Q, @' ^3 b: O
```
; X" M/ r) J1 x
+ ?, _4 h. ~8 S, w5 G% B7 X缺乏传递性令人担忧。我的建议是永远不要使用邪恶的双胞胎。相反,请始终使用它===和!==。刚刚显示的所有比较false与===操作员进行了比较。7 L& Y2 a1 P/ l1 m* f
更新:对于对象,==并===彼此一致行动(特殊情况除外)。
; `1 Y! C3 o( b, s& p4 o2 F
    var a = [1,2,3];var b = [1,2,3];var c = { x: 1,y: 2 };var d = { x: 1,y: 2 };var e = "text";var f = "te"   "xt";a == b       falsea === b      falsec == d       falsec === d      falsee == f       truee === f      true
    ; [6 `" W; L# q! G, _) f, {. {; j
特殊情况是,当你将一个基元与一个评估为相同基元的对象进行比较时,因为它toString或valueOf方法。例如,考虑使用字符串原语String比较构造函数创建的字符串对象。
6 E& C) |# Q: v' F) P: o4 \
    "abc" == new String("abc")    // true"abc" === new String("abc")   // false
    $ I. d5 [* C. Q% C( j! g7 C
此处==操作符正在检查两个对象的值并返回true,但===看到它们的类型不同并返回false。哪一个是正确的?这实际上取决于你想比较的内容。我的建议是完全绕过这个问题,但不要使用它String构造函数从字符串文本中创建字符串对象。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则