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

数据类型的细节知识

作者: 羽晞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