回答

收藏

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

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

我正在使用JSLint来检查 JavaScript,并且在执行语句内部比较等操作时,会返回很多建议==(两个等号)替换===(三个等号)。idSele_UNVEHtype.value.length == 0``if
) F2 ~+ ^8 a$ f4 J0 s. p7 j是否有性能优势取代==用===?
# G' g6 j, }% e7 M任何性能改进都会受到欢迎,因为多而受欢迎。; Z+ R4 e# F5 s- _
如果没有类型转换,性能会比较吗?==?6 N  K! i  M% L0 G1 V' c. _9 Q) i* J# i( I
                                                               
. x6 A1 S# K, P$ j* }$ c    解决方案:                                                                ; ?# Z: ^6 u- X
                                                                除类型转换外,严格相等运算符 ( ===) 行为等于抽象运算符 ( ==) 相同的类型必须相同才能被视为相等。5 {: R3 {3 O* N( k. d* _( i2 F
该==运营商将相对平等转换任何必要的类型后。该===运营商将不会因此,如果两个值是不同类型的===简单返回false。两者都一样快。) g" w- s& b2 t8 T( Q' C7 M9 T8 `( \
JavaScript 有两组相等运算符:===and !==,以及他们邪恶的双胞胎==and !=。一个好的方法将以你期望的方式工作。如果两个操作数的类型和值相同,则===产生true和!==产生false。当操作数是相同类型时,邪恶双胞胎会做正确的事情,但如果它们是不同类型,它们会尝试强制转换值。他们这样做的规则既复杂又难以记住。这些是一些有趣的案例:6 F( {  I, G( h5 S! p
```js
+ J1 Z2 G. [+ i‘’ == ‘0’      false2 Y' u/ e" B. n2 I0 P% `6 C. U
0 == ‘’       true
9 R# l! p/ u+ T! o/ G' T) _7 a! v0 == ‘0’       true; ~4 E& `; _1 @# U% z9 U
false == ‘false’    // false
' q) s" Q5 Z; L4 a- Vfalse == ‘0’     true
; w4 t& ~3 X9 t  ifalse == undefined  // false+ x8 e; [$ {1 g( ?9 l/ l' d8 ^# Y+ [
false == null    false- T* z3 b8 k+ A1 }% x
null == undefined   // true# j( Y2 U9 J1 u* F& l* E
‘ \t\r\n ‘ ==   true
7 \9 \2 g' G4 A# B& r```2 k3 p) q. R, }0 v- k

- J7 F$ Q$ v7 P- p5 u/ \9 K缺乏传递性令人担忧。我的建议是永远不要使用邪恶的双胞胎。相反,请始终使用它===和!==。刚刚显示的所有比较false与===操作员进行了比较。
4 L, m0 {/ H' d% i+ b+ _/ B6 L更新:对于对象,==并===彼此一致行动(特殊情况除外)。
5 R- g0 z) Y2 E
    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; A2 a% h" r% M% O
特殊情况是,当你将一个基元与一个评估为相同基元的对象进行比较时,因为它toString或valueOf方法。例如,考虑使用字符串原语String比较构造函数创建的字符串对象。
' Z( J; |4 R# ^5 n3 l
    "abc" == new String("abc")    // true"abc" === new String("abc")   // false
    1 @4 Z  y( s7 ^7 o$ b( |6 ]6 d
此处==操作符正在检查两个对象的值并返回true,但===看到它们的类型不同并返回false。哪一个是正确的?这实际上取决于你想比较的内容。我的建议是完全绕过这个问题,但不要使用它String构造函数从字符串文本中创建字符串对象。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则