在 JavaScript 比较中应该使用哪个等于运算符 (== vs ===)?
技术问答
246 人阅读
|
0 人回复
|
2023-09-11
|
我正在使用JSLint来检查 JavaScript,并且在执行语句内部比较等操作时,会返回很多建议==(两个等号)替换===(三个等号)。idSele_UNVEHtype.value.length == 0``if
0 E9 I7 F4 D7 v# V$ k( J- ]6 r/ H' S5 p是否有性能优势取代==用===?* C- U+ t) @+ E6 ]: m; M6 W. U
任何性能改进都会受到欢迎,因为多而受欢迎。4 a+ F7 Z! t2 l1 E& z4 |8 n9 T
如果没有类型转换,性能会比较吗?==?
9 j; W& ~: v8 v6 ^. ]. `
9 ?- t3 Z$ G" Y" [ 解决方案:
* A+ z1 |" F; [ 除类型转换外,严格相等运算符 ( ===) 行为等于抽象运算符 ( ==) 相同的类型必须相同才能被视为相等。' J" l3 v' J9 r
该==运营商将相对平等转换任何必要的类型后。该===运营商将不会因此,如果两个值是不同类型的===简单返回false。两者都一样快。: y' ~! m. Y; G- G
JavaScript 有两组相等运算符:===and !==,以及他们邪恶的双胞胎==and !=。一个好的方法将以你期望的方式工作。如果两个操作数的类型和值相同,则===产生true和!==产生false。当操作数是相同类型时,邪恶双胞胎会做正确的事情,但如果它们是不同类型,它们会尝试强制转换值。他们这样做的规则既复杂又难以记住。这些是一些有趣的案例:
1 v2 i& I% c5 A6 g2 a6 G" X```js
3 k8 n8 m/ l& ?- p" t‘’ == ‘0’ false, H; {0 m: }, @" _. x) o
0 == ‘’ true6 r3 ]4 S8 F( o: r$ j- w# W
0 == ‘0’ true
* v4 c. M$ a z E: Gfalse == ‘false’ // false
# m' d6 S3 E. B1 L' K% Yfalse == ‘0’ true. x- O' N0 G, y" U/ D
false == undefined // false6 L4 y* N5 v. g; A+ o
false == null false) @. c5 K, }+ l2 l
null == undefined // true
4 W& B2 y) g! Y7 r‘ \t\r\n ‘ == true
( u! n# h7 N- P8 e' |; b& b: P```/ j) g9 m" ~3 B# F8 R7 w

1 N# V) n% a$ ]: E: o' c0 [. ?% |) k缺乏传递性令人担忧。我的建议是永远不要使用邪恶的双胞胎。相反,请始终使用它===和!==。刚刚显示的所有比较false与===操作员进行了比较。! ?0 L6 O" @. }
更新:对于对象,==并===彼此一致行动(特殊情况除外)。/ N( b0 W" {7 A( g9 n- V% z) I
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
/ i- P# ?3 ~; x R 特殊情况是,当你将一个基元与一个评估为相同基元的对象进行比较时,因为它toString或valueOf方法。例如,考虑使用字符串原语String比较构造函数创建的字符串对象。
4 A6 l4 s& H) L"abc" == new String("abc") // true"abc" === new String("abc") // false" f: j; m* `( o. L( J j# L& f
此处==操作符正在检查两个对象的值并返回true,但===看到它们的类型不同并返回false。哪一个是正确的?这实际上取决于你想比较的内容。我的建议是完全绕过这个问题,但不要使用它String构造函数从字符串文本中创建字符串对象。 |
|
|
|
|
|