經典面試題:
var a = ?;
if (a == 1 && a == 2 && a == 3) {
console.log('OK');
}
正答:
1.重寫Symbol.toPrimitive屬性:
var a = {i: 0};
//a[Symbol.toPrimitive]也可以直接寫在物件中
a[Symbol.toPrimitive] = function () {
// this指向的是a 讓i每次進來+1
return ++this.i;
};
if (a == 1 && a == 2 && a == 3) {
console.log('OK');//輸出結果=======>OK
}
直接走a[Symbol.toPrimitive]獲取到的回傳值,
2.利用陣列的shift機制,shift方法洗掉陣列的第一個元素并回傳,用a和1,2,3做比較時依次回傳1,2,3,
var a = [1, 2, 3];
a.toString = a.shift;
if (a == 1 && a == 2 && a == 3) {
console.log('OK');//輸出結果=======>OK
}
a[Symbol.toPrimitive] ----------->undefined,
a.valueOf ----------->[1, 2, 3] 不是原始值型別,
重寫后的a.toString=a.shift,相當于每次呼叫a.shift洗掉陣列第一個元素并回傳依次回傳1、2、3,
3.利用ES6的資料劫持Object.defineProperty,核心方法值發生變化時會觸發對應的get/set方法
var i = 0;
Object.defineProperty(window, 'a', {
get() {
return ++i;
}
});
if (a == 1 && a == 2 && a == 3) {
console.log('OK');
}
資料型別分為兩種 基本資料型別 和 物件型別,
基本資料型別(也叫原始值型別):
undefined、null、number、string、booleadn、symbol(ES6)、bigint
symbol:可以用做物件的屬性,當做唯一標識來用,
bigint:用于處理大于Number.MAX_SAFE_INTEGER 9007199254740991最大安全數字運算操作,Number超過最大安全數字,再進行運算,運算結果不一定準確,
物件型別:
Object、Array、RegExp、Date、Math、JSON、Number、String、Boolean …
- 底層原理
數學運算、字串拼接、==比較、隱式(顯示)轉換、特殊方法處理都需要物件型別轉換為數字或字串型別,- 首先檢測物件的Symbol.toPrimitive這個屬性獲取原始值;
- 如果獲取不到,呼叫物件的valueOf獲取原始值;
- 如果呼叫valueOf得到的值不是原始值型別,則繼續呼叫他的toString方法轉換為字串;
- 再講字串基于Number轉換為數字型別;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/239631.html
標籤:其他
上一篇:【2020-12-23】JS逆向之某在線監測分析平臺
下一篇:生產事故:年終獎殺手雖遲但到!
