一些團隊規定禁用 ==
運算符換用===
嚴格相等。以工程標准衡量,==
帶來的便利性抵不上其帶來的成本,團隊協作時候你看到別人代碼中的 ==
,有些時候需要判斷清楚作者的代碼意圖是確實需要轉型,還是無所謂要不要轉型只是隨手寫了,增加了一些額外的成本。但是我比較喜歡的一本書 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');
}