隐式转换规则
const isNull = (o) => o === null
const isUndefined = (o) => o === undefined
const _toString = (o) => Object.prototype.toString.call(o)
const _isNaN = (o) => _toString(o) === "[object Number]" && isNaN(o)
//(o) =>!isUndefined(o)&&isNull(o) && o !== Object(o)
function isPrimitive(value) {
return typeof value === "undefined" ||
typeof value === "boolean" ||
typeof value === "number" ||
typeof value === "string" ||
typeof value === "symbol";
}
const onPrimitive = (obj) => {
if (!isPrimitive(obj)) {
console.log("转换成原始值")
let pm=obj.valueOf()
return isPrimitive(pm)? pm:pm.toString()
}
return obj
}
function myConvert(a, b) {
if (_isNaN(a) || _isNaN(b)) {
console.log("---0-如果一边值为NaN,一律返回false。-----")
return false
}
if (_toString(a) === _toString(b)) {
// **null===null;undefined===undefined return true
console.log("----1两端类型相同,比较值。-----")
//null===null; [object Null] true
//undefined===undefined; true
//{}==={}; false;
return a === b
}
// ---------------处理 null undefined------------------------------
if (isNull(a) && isUndefined(b)||isNull(b) && isUndefined(a)) {
console.log("-2-undefined 和 null 只有自身与自身比较,或者这俩互相比较时才return true-")
return true;
}
// ---------------------------------------------
if (isPrimitive(a) && isPrimitive(b)) {
console.log("---3两端都是原始类型 转成数字比较--number,string,boolean---")
if (_toString(a) !== "[object Number]") {
a = Number(a)
}
if (_toString(b) !== "[object Number]") {
b = Number(b)
}
return a === b
} else {
if(!isPrimitive(a) && !isPrimitive(b)){
console.log("---4 两端都是对象类型,比较引用地址-----")
return a===b
}
console.log("---5 一端是对象类型,把对象转换成原始类型后进入第1步-----")
return myConvert(onPrimitive(a), onPrimitive(b))
}
return true
}
测试
function test(a, b) {
console.log(`==============[${a}==${b} ]=============================`)
console.log(myConvert(a, b))
console.log("--------------")
console.log(a == b)
console.log("=============================================")
}
// test(1, "1")
// test(undefined, null)
// test(null, undefined)
// test(null, null)
// test(undefined, null)
// test(1, null)
// test("0", {})
// test({}, {})
大厂面试题
//?等于什么才能输出true
var a=?;
console.log(
a==1&&
a==2&&
a==3)
//----------答案
a={
n:1;
valueOf(){
return this.n++;
}
}