模拟一个js底层数据类型隐式转换

隐式转换规则

  • 两端类型相同,比较值。
  • 如果一边值为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)
//(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++;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值