Alvin-Liu/Blog

JavaScript为什么要用 “===”?

Closed this issue · 0 comments

JavaScript 要不要使用 "===",这个问题困扰了我一段时间了。

我习惯性会使用 “===“,但是有的同事会使用 ”==“,因为公司代码规范没有强制用哪种,所以实际项目中难免出现代码风格不统一的情况,甚至是同一个页面。

趁着周末空余,特意整理了一下 “==” 和 “===” 的问题。

查询MDN得知,"===" 叫做严格运算符,"==" 叫做相等运算符

相等运算符(==)

对于相等运算符(==)来说,会在进行比较之前,将两个操作数转换成相同的类型,再用严格相等运算符比较。

优点

  1. 简化代码量,不用做类型转换,很多时候可以简化代码量
  2. 判断方便、灵活

缺点

  1. 对类型做出错误的假设,比如
if (x == 10) x += 5

如果传入的x是字符串'10'x的结果会变成'105'。在后续运算中字符串'105'又可能被转型,从而引入隐蔽的错误。

  1. 相等运算符隐藏的类型转换,会带来一些违反直觉的结果
'' == '0'           // false
0 == ''             // true
0 == '0'            // true
  1. 程序员可能不自觉的依赖某些假设——比如相等比较应该具有传递性,即 a = b, b = c,应该能得出 a = c。但是JavaScript== 不具有传递性。比如 0 == '0' 0 == '',但是 '0' != ''
  2. 副作用
var x = 1;
var obj = {valueOf: function(){ x = 2; return 0 }}
console.log(obj == 0, x) // true, 2
  1. 产生异常
var x = 1;
var obj = {valueOf: function(){ return {} }, toString: function(){ return {}}}
console.log(obj == 0) // Error: Cannot convert object to primitive value
  1. 等于的转换太难记

来张图感受一下(来源于:https://dorey.github.io/JavaScript-Equality-Table/

b5e3d01fgy1fy90sxoed5j218c164n0y

严格运算符(===)

对于严格比较运算符(===)来说,仅当两个操作数的类型相同且值相等为 true

优点

  1. 不容易出错
  2. 可读性和可维护性好
  3. 可以避免等于判断中隐式的类型转换

缺点

相比于相等运算符,严格运算符只是在它的基础上做“减法”,缺点大概是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.

这是本好书,但是不代表作者的所有观点都是对的

总结

推荐使用严格运算符,不使用相等运算符不是为了让行为更加容易预测,而是因为这样可以更少出错,并且提高代码的可读性和可维护性

如果对你来说编程是一项工作,而不仅仅是兴趣爱好,就需要用工程标准进行衡量。而以工程标准衡量,相等运算符带来的便利性抵不上其带来的成本。

参考

知乎:Javascript 中 == 和 === 区别是什么?