JS-------数据类型

38 阅读4分钟

JS-------数据类型

JS中的数据类型

原始值类型「基本数据类型、值类型」

  • number
  • string
  • boolen
  • undefined
  • null
  • symbol
  • bigint

对象类型「引用数据类型」

  • 标准普通对象  object  {}
  • 标准特殊对象  数组、正则、日期、Error错误对象、Math...
  • 函数对象(可调用可执行对象,内部实现了[[call]]方法) function
  • 非标准特殊对象  原始值类型对应的对象类型实例,例如:new Number(10)...

数据类型转换

类型转换可以分为隐式类型转换显示类型转换

转换为string

显示 :String()直接转字符串

隐式 :+号代表字符串拼接

如果加号有左右两边,其中一边是字符串或者对象,属于字符串拼接)、

parseInt中的第一个参数必须是字符串、alert...

        String([1, 2, 3])    //"1,2,3"
        String({})    //"[object Object]"
        1 + '123' //"1123"
        1 + {} //"1[object Object]"

转为boolean

除了“0/NaN/空字符串/null/undefined”变为false,其余都是true
对象转换为布尔也是按照上面这句话,结果都是true
布尔类型转换只会有true和false两种结果

显示: Boolean()直接转为布尔值

隐式 :隐式类型转换通常在逻辑判断或者逻辑运算符时触发(&&||!)

逻辑运算符(比如 || 和 &&)是在内部做了 boolean 类型转换,但实际上返回的是原始操作数的值,即使他们都不是 boolean 类型。

        Boolean(2)    // 显示类型转换
        if (2) { }      // 逻辑判断触发隐式类型转换
        !!2           // 逻辑运算符触发隐式类型转换
        2 || 'hello'  // 逻辑运算符触发隐式类型转换
        
        // 返回 number 类型 123,而不是 boolean 型 true
        // 'hello' 和 '123' 仍然在内部会转换成 boolean 型来计算表达式
        let x = 'hello' && 123  // x === 123

转为number

显示: Number()转换为数字类型

  • 字符串->数字  空字符串变为0;出现任意非有效数字字符,结果都是NaN
  • 布尔->数字  true转换为1  false转换为0
  • undefined->NaN
  • null->0
  • Biglnt去除n
  • symbol会报错
  • 对象->数字
    • 先调用 “对象[Symbol.toPrimitive]”,如果不存在这个属性
    • 再调用 “对象.valueOf”,看获取的是否为原始值,如果不是原始值
    • 再调用 “对象.toString”,转换为字符串
    • 最后把字符串转换为数字
   let obj = {
            name: 'xxx'
        }
        console.log(obj - 10) // 数学运算:先把obj隐式转换为数字,再进行运算
        //运行机制
        obj[Symbol.toPrimitive] //undifined 
        obj.valueof() // {name:xxx}
        obj.toString() // [object object]
        Number("[object object]") // NaN
        NaN - 10 // NaN 

隐式: 数学运算、isNaN、==...    基于Number(val)实现转换

当+操作存在任意的操作数是String时,不会触发number类型的隐式转换

isNaN和NaN

NaN

  • 表示非数值 not anumber不是个数字
  • NaN和任何数据比较,永远返回false
  • 任何与NaN进行运算的结果都是NaN
  • NaN不与任何值相等,包括他自身,它属于number类型

isNaN

  • isNaN用来判断某个值是不是有效数字返回结果是布尔型类型
  • true非有效数字
  • false有效数字
  • 如果判断的值不是数字类型,会隐式调用Number方法,转为数字之后再进行判断
   isNaN(0);//false
   isNaN(1);//false
   isNaN("12px");//===》Number("12px")===>NaN==>isNaN(NaN)===>true
  isNaN({});//===>Number({})===>{}.toString()==>"[object Object]"==>Number("[object Object]");//====>NaN====isNaN(NaN)====>true
   isNaN([]);//===>isNaN(0)===>false
   isNaN([1,2]);// true
   //-----不管是true还是false 都是布尔,转为数字不是1就是0,都是有效数字
   isNaN(true);//  false
   isNaN(false);// false

==比较的隐式转换规则

如果两边的数据类型不同,需要先转为相同的类型,然后再进行比较

  • 对象==字符串  对象转换为字符串
  • NaN==NaN  => false  NaN和任何值都不相等
  • null==undefined => true  三个等号比较就是false,但是和其它值都不相等
  • 对象==对象  比较的是堆内存地址   []==[] => false
  • 剩下如果两边不相等,都是转换为数字
练习题

let result = 100 + true + 21.2 + null + undefined + "Tencent" + [] + null + 9 + false;

// result应该是?

[解析]
        1.首先100+true
        连接符两边存在Number类型,true转为number为1进行加法运算101
        2.101+21.2
        连接符两边均为Number类型,进行加法运算结果为122.2
        3.122.2+null
        连接符两边存在Number类型,null转为number为0.进行加法运算122.2
        4.122.2+ undefined
        连接符两边存在Number类型,undefined转number为NaN,NaN与任何数据运算都是NaN
        5.NaN+"Tencent"
        连接符两边存在String类型,NaN转string类型"NaN"进行字符串拼接结果为"NaNTencent"
        6."NaNTencent"+[]
        连接符两边存在String类型,[]转为string"",进行字符串拼接"NaNTencent"
        7."NaNTencent"+null
        连接符两边存在String类型,null转string为"null",进行字符串拼接,结果为:"NaNTencentnull"
        8."NaNTencentnull"+9 
        连接符存在String类型,9转string为"9",进行字符串拼接,结果为:"NaNTencentnull9" 
        9."NaNTencentnull9" +false
        连接符存在String类型,false转string为"false",进行字符串拼接,结果为:"NaNTencentnull9false

-------------------------------------------------完结-------------------------------------------------------------

--------------------------接受大佬们的批改,欢迎留言--------------------------------------------------