Skip to content

JS的数据类型-概述

分类

  • 原始类型 Primitive Types

    • Nmber
    • String
    • Boolean
    • undefined
    • null
    • Symbol
  • 对象类型 Object Types

    • 狭义的Object
    • Array
    • Function

判别变量的数据类型

typeof运算符

typeof 运算符可以返回一个值的数据类型,但是并不完善,无法区分null、数组和普通对象

null的类型是object,这是由于历史原因造成的。1995年的 JavaScript 语言第一版,只设计了五种数据类型(对象、整数、浮点数、字符串和布尔值),没考虑null,只把它当作object的一种特殊值。后来null独立出来,作为一种单独的数据类型,为了兼容以前的代码,typeof null返回object就没法改变了。

js
// 原始类型
let a = 123
let b = '123'
let c = false
let d = Symbol('12')
let e = null
let f = undefined

// 对象类型
let x = function () { }
let y = [1, 2, 3]
let z = { a: 1, b: 2 }

console.log(typeof(a)) // 'number'
console.log(typeof(b)) // 'string'
console.log(typeof(c)) // 'boolean'
console.log(typeof(d)) // 'symbol'
console.log(typeof(e)) // 'object'     !!!
console.log(typeof(f)) // 'undefined'  !
console.log(typeof(x)) // 'function'   !
console.log(typeof(y)) // 'object'     !!!
console.log(typeof(z)) // 'object'     !!!

instanceof运算符

instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象原型链上。其返回值是一个布尔值。( 注:原始类型不可用 )

js
let a = 123
let b = '123'
let c = false
let d = Symbol('12')
let e = null
let f = undefined

let x = function () { }
let y = [1, 2, 3]
let z = { a: 1, b: 2 }

console.log(a instanceof Number) // false
console.log(b instanceof String) // false 
console.log(c instanceof Boolean) // false
console.log(d instanceof Object) // false
console.log(e instanceof Object) // false
console.log(f instanceof Object) // false
console.log(x instanceof Function) // true
console.log(y instanceof Array) // true
console.log(z instanceof Object) // true

❓ 为什么 123 instanceof Number 是 false ,而[1,2] instanceof Array 是 true ?

  • instanceof 运算符只适用于对象类型
  • 补充:虽然有自动装箱机制,但 instanceOf 对于原始类型就是会直接返回false

Object.prototype.toString.call()

在早期的 JavaScript(ES5 及之前),每个对象都有一个内部属性 [[Class]],它是一个字符串,表示对象的类型。

虽然在 ES6 后这个属性被废弃了,但 Object.prototype.toString() 的行为被保留了下来,仍然可以返回类似 [[Class]] 的信息。

所以它能准确识别:

  • 原始包装类型(Number、String、Boolean)
  • 内置对象(Array、Date、RegExp、Map、Set 等)
  • null 和 undefined(特殊处理)
js
let a = 123
let b = '123'
let c = false
let d = Symbol('12')
let e = null
let f = undefined

let x = function () { }
let y = [1, 2, 3]
let z = { a: 1, b: 2 }

console.log(Object.prototype.toString.call(a)) // [object Number]
console.log(Object.prototype.toString.call(b)) // [object String]
console.log(Object.prototype.toString.call(c)) // [object Boolean]
console.log(Object.prototype.toString.call(d)) // [object Symbol]
console.log(Object.prototype.toString.call(e)) // [object Null]
console.log(Object.prototype.toString.call(f)) // [object Undefined]
console.log(Object.prototype.toString.call(x)) // [object Function]
console.log(Object.prototype.toString.call(y)) // [object Array]
console.log(Object.prototype.toString.call(z)) // [object Object]