1. 程式人生 > 其它 >資料型別轉換——經典面試題

資料型別轉換——經典面試題

技術標籤:前端javascriptjses6

經典面試題:

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轉換為數字型別;