JS|数据类型以及隐式转换

88 阅读3分钟

--记录,为了以后更方便的回顾-- 原文链接

最新的标准定义了8种数据类型:

  • undefined

  • boolean

  • number

  • string

  • bigint

  • Symbol

  • null

  • object

    其中能用typeof检查出来类型的是前六个,typeof null => 'object',除了Object以外的所有类型的值是不可变的,

装箱与拆箱:就是基本数据类型在引用数据类型中的对应,两者的相互转换叫做装箱与拆箱

Boolean:

let x = Boolean(expression);     // 推荐
let x = !!(expression);          // 推荐
let x = new Boolean(expression); // 不太好

除了0、-0、null、undefined、false、NaN、''之外都是true

隐式转换:

  • 减、乘、除

    对各种非number类型运用数学运算符(- * /),会先讲非number类型转换为number类型

    1 - true // 0, 首先把 true 转换为数字 1, 然后执行 1 - 1
    1 - null // 1,  首先把 null 转换为数字 0, 然后执行 1 - 0
    1 * undefined //  NaN, undefined 转换为数字是 NaN
    2 * ['5'] //  10, ['5']首先会变成 '5', 然后再变成数字 5
    
    • 加法

    通俗的讲就是,会先将左右的值调用js引擎提供的`toprimitve`方法转换为原生数据类型,然后进行下面的运算。
    
    • 当一侧为string类型,会优先将另一侧转换为字符串
    • 当一侧为number类型,另一侧为原始类型,则将原始类型转换为number类型
    • 当一侧为number类型,另一侧为引用类型,将引用类型和number类型转换为字符串后拼接

    其中ToPrimitve的操作流程为:

    123 + '123' // 123123   (规则1)
    123 + null  // 123    (规则2)
    123 + true // 124    (规则2)
    123 + {}  // 123[object Object]    (规则3)
    

    ---总结就是:有字符串就全转为字符串,没有字符串有数字就全转数字

    • 逻辑语句中的类型转换

    • 单个变量:将变量转换为Boolean值,除了0、-0、null、undefined、false、NaN、''之外都是true

    • 使用了==进行比较

      • NaN和其他任何类型比较永远返回false(包括自身)

      • Boolean和其他任何类型比较,Boolean先被转化为Number类型

      • StringNumber比较,先将String转为Number

      • null == undefined结果为true(查到的一种说法是:在js中两者都是不存在的,所以==的情况下是相等的,都代表没有),除此之外,null、undefined和其他任何结果的比较值都是false

      • 原始类型和引用类型做比较是,引用类型会依照ToPrimitive规则转换为原始类型

         可以参考下表进行快速查找:👇👇👇
        
        类型to Booleanto Numberto String
        Booleantruetrue1'true'
        Booleanfalsefalse0'false'
        Number123true123'123'
        NumberInfinitytrueInfinity'Infinity'
        Number0false0'0'
        NumberNaNfalseNaN'NaN'
        String''false0''
        String'123'true123'123'
        String'123abc'trueNaN'123abc'
        String'abc'trueNaN'abc'
        Nullnullfalse0'null'
        UndefinedundefinedfalseNaN'undefined'
        FunctionFunction() {}trueNaN'function() {}'
        Object{}trueNaN'[object Object]'
        Array[]true0''
        Array['abc']trueNaN'abc'
        Array['123']true123'123'
        Array['123','abc']trueNaN'123,abc'