JavaScript为什么要用 “===”?
Closed this issue · 0 comments
JavaScript 要不要使用 "===",这个问题困扰了我一段时间了。
我习惯性会使用 “===“,但是有的同事会使用 ”==“,因为公司代码规范没有强制用哪种,所以实际项目中难免出现代码风格不统一的情况,甚至是同一个页面。
趁着周末空余,特意整理了一下 “==” 和 “===” 的问题。
查询MDN得知,"===" 叫做严格运算符,"==" 叫做相等运算符
相等运算符(==)
对于相等运算符(==)来说,会在进行比较之前,将两个操作数转换成相同的类型,再用严格相等运算符比较。
优点
- 简化代码量,不用做类型转换,很多时候可以简化代码量
- 判断方便、灵活
缺点
- 对类型做出错误的假设,比如
if (x == 10) x += 5
如果传入的x
是字符串'10'
,x
的结果会变成'105'
。在后续运算中字符串'105'
又可能被转型,从而引入隐蔽的错误。
- 相等运算符隐藏的类型转换,会带来一些违反直觉的结果
'' == '0' // false
0 == '' // true
0 == '0' // true
- 程序员可能不自觉的依赖某些假设——比如相等比较应该具有传递性,即
a = b, b = c
,应该能得出a = c
。但是JavaScript
的==
不具有传递性。比如0 == '0'
,0 == ''
,但是'0' != ''
。 - 副作用
var x = 1;
var obj = {valueOf: function(){ x = 2; return 0 }}
console.log(obj == 0, x) // true, 2
- 产生异常
var x = 1;
var obj = {valueOf: function(){ return {} }, toString: function(){ return {}}}
console.log(obj == 0) // Error: Cannot convert object to primitive value
- 等于的转换太难记
来张图感受一下(来源于:https://dorey.github.io/JavaScript-Equality-Table/)
严格运算符(===)
对于严格比较运算符(===)来说,仅当两个操作数的类型相同且值相等为 true
优点
- 不容易出错
- 可读性和可维护性好
- 可以避免等于判断中隐式的类型转换
缺点
相比于相等运算符,严格运算符只是在它的基础上做“减法”,缺点大概是JavaScript
是一门弱类型的语言,某些情况下的判断会造成额外的冗余代码
《You don't know JS》:
Many developers feel that === is more predictable, so they advocate always using that form and staying away from ==. I think this view is very shortsighted. I believe == is a powerful tool that helps your program, *if you take the time to learn how it works.
这是本好书,但是不代表作者的所有观点都是对的
总结
推荐使用严格运算符,不使用相等运算符不是为了让行为更加容易预测,而是因为这样可以更少出错,并且提高代码的可读性和可维护性
如果对你来说编程是一项工作,而不仅仅是兴趣爱好,就需要用工程标准进行衡量。而以工程标准衡量,相等运算符带来的便利性抵不上其带来的成本。
参考