• 模拟一个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
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64

    测试

    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({}, {})
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    大厂面试题

    //?等于什么才能输出true
    var a=?;
    console.log(
    	a==1&&
    	a==2&&
    	a==3)
    
    //----------答案
    a={
    	n:1;
    	valueOf(){
    		return this.n++;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
  • 相关阅读:
    Apache IoTDB v1.2.2 发布|增加 flink-sql-connector、tsfile 文件级级联传输等功能
    elementUI elfrom表单验证无效、不起作用常见原因
    mysql 主从复制 mysql版本5.7.35
    农夫山泉2面面试经历
    Unity--用户界面
    JVM第一话 -- JVM入门详解以及运行时数据区分析
    【gzoj】鸡蛋的硬度【基础概率DP】
    CentOS常见的命令
    centOS 7 Install Harbor(私有镜像仓库)V2
    QFramework v1.0 使用指南 工具篇:09. SingletonKit 单例模板套件
  • 原文地址:https://blog.csdn.net/u012123026/article/details/134302201