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');
}