一些团队规定禁用 == 运算符换用 === 严格相等. 以工程标准衡量,== 带来的便利性抵不上其带来的成本, 团队协作时候你看到别人代码中的 ==, 有些时候需要判断清楚作者的代码意图是确实需要转型, 还是无所谓要不要转型只是随手写了, 增加了一些额外的成本. 但是我比较喜欢的一本书 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.
简译为
很多开发者认为 === 的行为更加容易预测, 从而主张使用 === 而远离 ==. 我认为这种观点是非常短视的, 如果你花点时间去搞清楚它的工作原理,== 将是你开发的强大工具.
究竟谁对谁错也没有定论, 但是去了解一些隐式转换的规则, 对我们开发和调试 bug 都非常有帮助. 这些规则规定很烦多, 一个个看过来很无趣也不能全记住. 我们下面从这个问题的一些答案中去探究其中的一小部分规则.
下面代码中 a 在什么情况下会打印 1?
- var a = ?;
- if(a == 1 && a == 2 && a == 3)
- {
- console.log(1);
- }
利用重写 toString/valueOf
- let a = {
- i: 1,
- toString () { // 或者 valueOf
- return a.i++ // 先返回后加
- }
- }
- if(a == 1 && a == 2 && a == 3) {
- console.log('1');
- }
数组对象:
toString 方法返回一个字符串, 该字符串由数组中的每个元素的 toString() 返回值经调用 join() 方法连接 (由逗号隔开) 组成, 改写 join 方法为 shift, 每次返回第一个元素, 并删除.
- var a = [1,2,3];
- a.join = a.shift;
- if(a == 1 && a == 2 && a == 3) {
- console.log('1');
- }
ES6 的 symbol:
Symbol.toPrimitive 就是其中一个, 它指向一个方法, 表示该对象被转为原始类型的值时, 会调用这个方法, 返回该对象对应的原始类型值. 这里就是改变这个属性, 把它的值改为一个 闭包 返回的函数.
- let a = {[Symbol.toPrimitive]: ((i) => () => ++i) (0)};
- if(a == 1 && a == 2 && a == 3) {
- console.log('1');
- }
JavaScript 的隐式类型转换(使(a==1&&a==2&&a==3) 成立)
来源: http://www.bubuko.com/infodetail-3207078.html