一些团队规定禁用 ==
运算符换用===
严格相等。以工程标准衡量,==
带来的便利性抵不上其带来的成本,团队协做时候你看到别人代码中的 ==
,有些时候须要判断清楚做者的代码意图是确实须要转型,仍是无所谓要不要转型只是随手写了,增长了一些额外的成本。可是我比较喜欢的一本书 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都很是有帮助。这些规则规定很烦多,一个个看过来很无趣也不能全记住。咱们下面从这个问题的一些答案中去探究其中的一小部分规则。this
下面代码中 a 在什么状况下会打印 1?spa
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'); }
数组对象:code
toString 方法返回一个字符串,该字符串由数组中的每一个元素的 toString() 返回值经调用 join() 方法链接(由逗号隔开)组成,改写join方法为shift,每次返回第一个元素,并删除。orm
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'); }