美文网首页前端架构系列
数据类型的细节知识

数据类型的细节知识

作者: 羽晞yose | 来源:发表于2020-08-12 23:09 被阅读0次

    本文代码全是题目,用于检验知识掌握程度,简单的不会解析,直接给答案

    数据类型

    • 基本类型
      • number
      • string
      • boolean
      • null
      • undefined
      • symbol
      • bigint
    • 引用类型
      • object
        • 普通对象
        • 数组对象
        • 正则对象
        • 日期对象
        • Math数学函数对象
        • ...
      • function

    数据类型检测

    • typeof 检测数据类型的逻辑运算符
    • instanceof 检测是否为某个类的实例
    • constructor 检测构造函数
    • Object.prototype.toString.call 检测数据类型

    typeof 特点

    • 返回结果都是字符串

    • 局限性

      • typeof null => object

      所有的值在内存中都是二进制存储的,而null代表空指针,其值全为0,而类型判断时,发现前三位为000,所以被认为是对象

      • typeof 不能细分对象类型(检测普通对象或者数组对象等都是'object')

    面试题:

    let a = typeof typeof typeof [12, 23]
    console.log(a); // 'string'
    

    Number类型

    • 常规数值
    • NaN - 代表不是一个有效数字
    • infinity - 无穷大的值
    • -infinity - 无穷小的值
    • parseInt / parseFloat()
    • Number()
    • ...

    NaN

    特点:NaN和任何类型值都不相等,NaN和自身也不相等
    判断:isNaN 用于判断是否为NaN

    let res = parseFloat('left: 200px');
    if (res === 200) {
        alert(200)
    } else if (res === NaN) {
        alert(NaN)
    } else if (typeof res === 'number') {
        alert('number') // 'number'
    } else {
        alert('Invaild Number')
    }
    

    解析:parseFloatparseInt的特点是接收一个字符串,从左到右进行查找(遇到非有效数字字符则停止查找),如果处理的不是字符串,会先转换为字符串再进行查找,如果结束是没有找到任何有效数字,则返回NaN。所以res = NaN,NaN和任何类型值都不相等,但它是个数值类型,所以会输出'number'

    把其他数据类型转换为数字的方法

    • 强转换(基于底层机制转换的),底层机制就是通过Number([value])
      • 隐式转换都是基于Number()完成的
        • isNaN('12px') - 先把其他类型值转换为数字再检测
        • 数学运算 '12px' - 13
        • 字符串 == 数字 两个等号比较,很多时候需要把其他值转换为数字
    • 弱转换(基于一些额外的方法),parseInt() / parseFloat
    parseInt('') // NaN
    Number('') // 0
    isNaN('') // '' => 0,false
    parseInt(null) // NaN
    Number(null) // 0
    isNaN(null) // isNaN(0) => false
    parseInt('12px') // 12
    Number('12px') // NaN
    isNaN('12px') // true
    parseFloat('1.6px') + parseInt('1.2px') + typeof parseInt(null)
    // 1.6 + 1 + typeof NaN => '2.6Number'
    isNaN(Number(!!Number(parseInt('0.8'))))
    // !!Number(0) => Number(0) => false
    typeof !parseInt(null) + !isNaN(null)
    // typeof true + !isNaN(0) => 'boolean' + true => 'booleantrue'
    
    // 压轴题
    let res = 10 + false + undefined + [] + 'Tencent' + null + true + {}
    console.log(res)
    /**
     * 10 + false => 10 + 0 => 10
     * 10 + undefined => 10 + Number(undefined) => 10 + NaN => NaN
     * NaN + [] => NaN + '' => 'NaN'
     * NaN + 'Tencent' => 'NaNTencent'
     * 'NaNTencent' + null + true => 'NaNTencentnulltrue'
     * 'NaNTencentnulltrue' + {} => 'NaNTencentnulltrue' + ({}).toString() =>
     * 'NaNTencentnulltrue' + '[object Object]' =>
     * 'NaNTencentnulltrue[object Object]'
    

    +加号

    特点:遇到字符串(或者对象,因为对象就是先转换为字符串然后再处理),那么就不是数值运算,而会转变成字符串拼接

    ==转换规律

    • 对象==字符串,对象转换为字符串进行比较
    • null == undefined,但是和其他值都不相等
    • 两边不同类型,都转换为数字

    相关文章

      网友评论

        本文标题:数据类型的细节知识

        本文链接:https://www.haomeiwen.com/subject/etsvdktx.html