大家好我是林三心,又一週過去了,哎,想想年紀又大了,就煩。今天突然有人問我:
(a == 1 && a == 2 && a ==3) 有可能是 true 嗎
我當時就想一腳踹過去,你這不是在耍我嗎?當我的腳離他的臉一釐米時,我突然發現,誒!好像有點意思哦
物件型別轉換
當兩個型別不同時進行==比較時,會將一個型別轉為另一個型別,然後再進行比較。 比如Object
型別與Number
型別進行比較時,Object
型別會轉換為Number
型別。Object
轉換為Number
時,會嘗試呼叫Object.valueOf()
和Object.toString()
來獲取對應的數字基本型別。
var a = {
i: 1,
toString: function () {
return a.i++;
}
}
console.log(a == 1 && a == 2 && a == 3) // true
陣列型別轉換
與上面這個型別轉換一樣,陣列呼叫toString()
會隱含呼叫Array.join()
方法 而陣列shift
方法的用法:shift()
方法用於把陣列的第一個元素從其中刪除,並返回第一個元素的值。如果陣列是空的,那麼shift()
方法將不進行任何操作,返回undefined
值。請注意,該方法不建立新陣列,而是直接修改原有的 陣列。 所以我們可以看到a == 1
時會呼叫toString()
,toString()
呼叫join()
,join()
等於shift
,則轉換為Number
型別後為1.
var a = [1, 2, 3];
a.join = a.shift;
console.log(a == 1 && a == 2 && a == 3); // true
defineProperty
使用一個defineProperty
,讓a
的返回值為三個不同的值。
var val = 0;
Object.defineProperty(window, 'a', { // 這裡要window,這樣的話下面才能直接使用a變數去 ==
get: function () {
return ++val;
}
});
console.log(a == 1 && a == 2 && a == 3) // true
你學廢了嗎?
結語
我是林三心,一個熱心的前端菜鳥程式設計師。如果你上進,喜歡前端,想學習前端,那我們們可以交朋友,一起摸魚哈哈,摸魚群,加我請備註【思否】