javascript的隱式類型轉換(使(a==1&&a==2&&a==3) 成立)

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