彻底玩转JS的数据类型转换

82 阅读1分钟

1.对象转换成数字或者字符串

  • 1.查找对象的Symbol.toPrimitive
  • 2.对象.valueOf() 原始值:number/string/boolean/null/undefined/symbol/bigint
  • 3.对象.toString 变为字符串
  • 4.字符串转数字 Number(str)
/* ==相等 ===绝对相等
 * ==在比较的时候,如果两边类型不一致,则转换为相同的数据类型
 *     NaN==NaN ->false   Object.is(NaN,NaN)->true
 *     null==undefined -> true  null===undefined -> false null&undefined和其他任何值比较都是不相等的
 *     对象==字符串  对象转换为字符串
 *     剩余的情况都是转换为数字
 * ===类型不一致,不会转换,直接false
 */
/* var a = ?;
if (a == 1 && a == 2 && a == 3) {
    console.log('OK');
} */

var a = {
    i: 0
}
// valueOf / toString
a[Symbol.toPrimitive] = function () {
    // this->a
    return ++this.i;
}
if (a == 1 && a == 2 && a == 3) {
    console.log('OK');
}

// 第二类: ES6 数据劫持
/* let obj = {};
Object.definedProperty(obj,'name',{
    // 以后当我们操作对象的name属性的时候(获取或设置),触发getter/setter
    get() {
        return '逗你玩';
    },
    set(value) {
        console.log(value);
    }
}); */

// var a = 12; //全局上下文中,基于var/function声明变量,也相当于给window设置了属性 window.a=12
var i = 0;
Object.definedProperty(window, 'a', {
    get() {
        return ++i;
    }
});
if (a ==1 && a == 2 && a == 3) {
    console.log('OK');
}