Skip to content

数据类型

JavaScript 数据类型分为基础数据类型和引用数据类型,

  • 栈:基础数据类型(Undefined、Null、Boolean、Number、String、Symbol)
  • 堆:引用数据类型(对象、数组和函数)

JavaScript 的基本数据类型包括:

  1. 数字(Number):表示整数和浮点数。
  2. 字符串(String):表示文本字符串。
  3. 布尔值(Boolean):表示真/假值。
  4. 空值(Null):表示空值或者空对象引用。
  5. 未定义(Undefined):表示变量已声明但未初始化。
  6. Symbol 类型(Symbol):表示独一无二的标识符。

而引用类型则包括:

  • 对象(Object):表示一组相关属性和方法的集合。
  • 数组(Array):表示一组有序的、可重复的元素的集合。
  • 函数(Function):表示可执行的代码块并可以通过调用来实现特定功能的对象。
  • 正则表达式(RegExp):表示一个正则表达式对象,用于匹配文本字符串中的模式。
  • 日期(Date):表示一个日期时间对象。

另外 BigInt (ES11) 新增的数据类型:是一种数字类型的数据,它可以表示任意精度格式的整数,使用 BigInt 可以安全地存储和操作大整数,即使这个数已经超出了 Number 能够表示的安全整数范围。

数据类型检测的方式有哪些

  1. typeof

    其中数组、对象、null 都会被判断为 object 查看原因,其他判断都正确。

    js
    console.log(typeof 2) // number
    console.log(typeof true) // boolean
    console.log(typeof 'str') // string
    console.log(typeof []) // object
    console.log(typeof function () {}) // function
    console.log(typeof {}) // object
    console.log(typeof undefined) // undefined
    console.log(typeof null) // object
  2. instanceof

    能正确判断对象的类型,其内部运行机制是判断在其原型链中能否找到该类型的原型,一但原型链被篡改,就失效。

    js
    console.log(2 instanceof Number) // false
    console.log(true instanceof Boolean) // false
    console.log('str' instanceof String) // false
    
    console.log([] instanceof Array) // true
    console.log(function () {} instanceof Function) // true
    console.log({} instanceof Object) // true
  3. Object.prototype.toString.call()

    Array、Function 等类型作为 Object 的实例,都重写了 toString 方法,所以不能调用自身 toString 方法

    js
    var a = Object.prototype.toString
    
    console.log(a.call(2)) // [object Number]
    console.log(a.call(true)) // [object Boolean]
    console.log(a.call('str')) // [object String]
    console.log(a.call([])) // [object Array]
    console.log(a.call(function () {})) // [object Function]
    console.log(a.call({})) // [object Object]
    console.log(a.call(undefined)) // [object Undefined]
    console.log(a.call(null)) // [object Null]

判断数组的方式有哪些

  1. Object.prototype.toString.call()

    js
    Object.prototype.toString.call(obj).slice(8, -1) === 'Array'
  2. instanceof

    js
    obj instanceof Array
  3. Array.isArray()

    js
    Array.isArrray(obj)

null 和 undefined

Undefined 和 Null 都是基本数据类型,都表示缺失的值,只有一个值,就是 undefined 和 null。

  • undefined 是一个全局变量,表示未定义的值或变量;
  • null 是一个关键字,它表示一个空对象引用;

typeof null

使用 typeof 进行判断时,Null 类型化会返回 “object”,这是一个历史遗留的问题。

在 JavaScript 早期版本中,null 被错误地识别为一个对象类型,而这个错误的结构一直保留到今天,为了保持向后兼容性,ECMAScript 标准没有改变这个行为。

提示

object 类型标签是 000,而 null 的二进制全是 0,自然前三位也是 0,所以 typeof null 结果是 object。

NaN

js
typeof NaN // number
NaN === NaN // false
  • NaN 并不是一个数字,是一个警戒值,表示计算失败;
  • NaN 是唯一一个自反与自身不相等,可使用 isNaNNumber.isNaN 来判断;

isNaN 和 Number.isNaN 函数都可以用来判断一个值是否为 NaN。但它们之间有一些区别:

  • isNaN 函数会将其参数转换为数字类型,如果不能转换,则将其视为 NaN。因此,对于非数字类型的参数,isNaN()可能会返回意料之外的结果。

    js
    console.log(isNaN('hello')) // 输出 true
    console.log(isNaN(undefined)) // 输出 true
    console.log(isNaN({})) // 输出 true
  • Number.isNaN 函数只有当其参数是 NaN 时才返回 true,否则返回 false。它不会对参数进行类型转换。因此,对于非 NaN 的非数字类型参数,Number.isNaN()始终返回 false。

    js
    console.log(Number.isNaN(NaN)) // 输出 true
    console.log(Number.isNaN('hello')) // 输出 false
    console.log(Number.isNaN(undefined)) // 输出 false
    console.log(Number.isNaN({})) // 输出 false