在 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 Evar 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构造函数从字符串文本中创建字符串对象。 |
|
|
|
|
|