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]