今天來看一道面試題,題目如下:如何使 a == 1 && a == 2 && a == 3成立。
分析:
比較兩個值是否相等有兩種,一個是 “==”,一個是“===”,而這里使用的是 “==”
===:絕對相等,左右兩邊值和類型都相等。(如 1 === '1' 是不成立的)
== :相等,左右兩邊類型不同,會默認先轉(zhuǎn)換為相同的類型,再去作比較。
- 對象 == 字符串:對象轉(zhuǎn)字符串
- null == undefined:相等,但和其他值都不相等
NaN == NaN:NaN與任何值都不相等(包括自己)- 剩下的都是轉(zhuǎn)化為數(shù)字
- 對象轉(zhuǎn)化為數(shù)字或字符串:
- 先調(diào)用
Symbol.toPrimitive這個屬性- 沒有這個屬性,再去調(diào)用
valueOf這個屬性去獲取原始值(基本類型值)- 沒有原始值,再去調(diào)用
toString變?yōu)樽址?/li>- 如果最后是轉(zhuǎn)換為數(shù)字,再去調(diào)用Number,把字符串轉(zhuǎn)換為數(shù)字
1、通過數(shù)據(jù)類型轉(zhuǎn)換的方式
var a = {
i: 0
}
a[Symbol.toPrimitive] = function () {
return ++this.i;
}
if (a == 1 && a == 2 && a == 3) {
console.log('OK');
}
var a = [1, 2, 3];
a.toString = a.shift;
if (a == 1 && a == 2 && a == 3) {
console.log('OK');
}
2、通過數(shù)據(jù)劫持的方式
在全局上下文中基于var/function聲明變量,相當于給window設置對應的屬性
window.a。Object.definePrototype借此對象中的某個屬性的獲取和設置等操作。
var i = 0;
Object.defineProperty(window, 'a', {
get () {
// 獲取window.a的時候觸發(fā)getter函數(shù)
return ++i;
},
set (value) {
// 設置window.a屬性值的時候觸發(fā)setter函數(shù)
}
})
if (a == 1 && a == 2 && a == 3) {
console.log('OK');
}