数据类型转换——经典面试题

经典面试题:

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转换为数字类型;

猜你喜欢

转载自blog.csdn.net/Lele___/article/details/111546826