【Js基础】数据类型

63 阅读2分钟

类型分类

基本数据类型

  • number NaN、Infinity
  • string 单引号、双引号、反引号
  • null
  • undefined
  • symbol 创建唯一值
  • bigint 大数数据类型

引用数据类型

  • object 普通对象、数组、正则、日期
  • function
  1. NaN不是一个有效数字,但是它是属于number数据类型的
  2. if(isNaN(n)) 条件成立,证明它真的是非有效的数字
  3. 判断两个数字是否相等 Object.is(n,n)
  4. Object.is(NaN,NaN)->true

  1. 唯一值let val = Symbol('A'); val==val //=>true
  2. Symbol('A')==Symbol('A')//=>false

  1. Number.MAX_SAFE_INTEGERjs中的最大安全数,超过这个值的,需要用bigint处理
  2. 一个数值后面加n就是bigint类型
  3. parseInt('12px')//=>12
  4. parseInt('px12')//=>NaN

类型检测

typeof

  • 返回的结果是字符串 typeof typeof xxx->'string'
  • 优点:简单,快捷,检测基本类型好使
  • 缺点:1. 无法细分是普通对象还是数组对象等(原理:typeof检测是按照计算机底层存储的二进制结果来进行检测的,对象都是以000开始的,所以基于typeof检测的结果都是'object')2. typeof null的结果是'object',因为null的二进制存储值也是000

instanceof

  • 用法:xxx instanceof Array/RegExp/Date
  • 原本不是检测数据类型的,是用来获取实例的构造函数的,基于这个特点可以来检测数据类型
  • 用来检测 普通对象/数组对象/正则对象/日期对象等具体对象的细分
  • 无法检测基本类型,另外 xxx instanceof Object 结果为true不能表示 xxx为普通对象,因为 [] instanceof Array 为true,[] instanceof Object 也为true
  • 可以任意更改类的prototype,使instanceof检测的不准确
  • 原理:类[Symbol.hasInstance](实例),根据当前实例的原型链__proto__是否存在这个类的原型prototype
function Person(){}
Person.prototype = Array.prototype
let p1 = new Person();
log(p1 instanceof Array)  ->true
log(p1 instanceof Object)  ->true 
log(p1 instanceof Person)  ->true

constructor

  • 用法 xxx.constructor === XXX
  • 原本是获取实例的构造函数的,利用这个特点来检测数据类型
  • 在不被更改constructor时候,可以具体区分数组和普通对象的细分
  • 可以随意更改,也是不太准确

Object.prototype.toString.call([value])或者({}).toString.call([value])

  • 用来检测数据类型很强大的一种方式
  • Object.prototype.toString就是用来检测数据类型的