回答

收藏

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

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

我正在使用JSLint来检查 JavaScript,并且在执行语句内部比较等操作时,会返回很多建议==(两个等号)替换===(三个等号)。idSele_UNVEHtype.value.length == 0``if
2 V6 l$ r9 F/ A9 W4 I! e是否有性能优势取代==用===?
* N+ ?$ s# \, R( K5 F/ N任何性能改进都会受到欢迎,因为多而受欢迎。
# v4 L) J) s: J; F. }5 J如果没有类型转换,性能会比较吗?==?
. a# y4 a& _2 q4 e; C4 u                                                                ! \9 x( p/ P1 g" N
    解决方案:                                                                , l7 [3 l& k  ]  u
                                                                除类型转换外,严格相等运算符 ( ===) 行为等于抽象运算符 ( ==) 相同的类型必须相同才能被视为相等。
& K4 C+ a6 M/ [- c7 m  w该==运营商将相对平等转换任何必要的类型后。该===运营商将不会因此,如果两个值是不同类型的===简单返回false。两者都一样快。
& @! l" Q* B5 O; M- ?( yJavaScript 有两组相等运算符:===and !==,以及他们邪恶的双胞胎==and !=。一个好的方法将以你期望的方式工作。如果两个操作数的类型和值相同,则===产生true和!==产生false。当操作数是相同类型时,邪恶双胞胎会做正确的事情,但如果它们是不同类型,它们会尝试强制转换值。他们这样做的规则既复杂又难以记住。这些是一些有趣的案例:
8 u+ c3 ^' [, i1 b: R* q+ L```js
9 K' P- d! N3 u6 n4 q. w‘’ == ‘0’      false/ K5 M( Z* T+ N( L: L
0 == ‘’       true4 ^; U, |- ]/ k' T' m0 L  G
0 == ‘0’       true. z# J2 ^) b! F3 I  A( @3 G
false == ‘false’    // false
- L1 d- |4 x! ~% G: q' efalse == ‘0’     true/ l7 G6 i* M3 N; X& A. t* h3 K1 T
false == undefined  // false
: n1 ?% _0 h6 b' S, q$ U6 Efalse == null    false
# w! d' n. c6 b. z9 u+ }null == undefined   // true8 E7 ^* w" n& M6 b6 [8 l( c2 |' }
‘ \t\r\n ‘ ==   true' c/ p# y: X% F( k
```
7 h- u) x/ f; y! ^
7 b# N2 A% a. Z& U& [缺乏传递性令人担忧。我的建议是永远不要使用邪恶的双胞胎。相反,请始终使用它===和!==。刚刚显示的所有比较false与===操作员进行了比较。
3 s  ]. M4 e2 n" r( g更新:对于对象,==并===彼此一致行动(特殊情况除外)。! n. H' N' @- f7 Z
    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% f* c$ A$ O9 d
特殊情况是,当你将一个基元与一个评估为相同基元的对象进行比较时,因为它toString或valueOf方法。例如,考虑使用字符串原语String比较构造函数创建的字符串对象。; X, r0 _4 p! S& V' G( b
    "abc" == new String("abc")    // true"abc" === new String("abc")   // false
    : ]: s' s6 M8 N; H$ ^% n: x
此处==操作符正在检查两个对象的值并返回true,但===看到它们的类型不同并返回false。哪一个是正确的?这实际上取决于你想比较的内容。我的建议是完全绕过这个问题,但不要使用它String构造函数从字符串文本中创建字符串对象。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则