隐式转换规则
- 两端类型相同,比较值。
- 如果一边值为NaN,一律返回false
- undefined 和 null 只有自身与自身比较,或者这俩互相比较时才return true
- 两端都是原始类型[number/string/boolean] 转成数字比较
- 只要有一端是对象类型,把对象转换成原始类型后进入第1步
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)
const isPrimitive = (o) => o !== Object(o)
const onPrimitive = (obj) => {if (!isPrimitive(obj)) {console.log("转换成原始值")return obj.valueOf().toString()}return obj
}
function myConvert(a, b) {if (_toString(a) === _toString(b)) {// **null===null;undefined===undefined return trueconsole.log("----1两端类型相同,比较值。-----")return a === b}if (_isNaN(a) || _isNaN(b)) {console.log("---0-如果一边值为NaN,一律返回false。-----")return false}// ---------------处理 null undefined------------------------------if (isNull(a) || isUndefined(a)) {if (!(isNull(b) || isUndefined(b))) return falseconsole.log("-2-undefined 和 null 只有自身与自身比较,或者这俩互相比较时才return true-")return true}if (isNull(b) || isUndefined(b)) {if (!(isNull(a) || isUndefined(a))) return falseconsole.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 {console.log("---4 只要有一端是对象类型,把对象转换成原始类型后进入第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({}, {})