包括基本类型和引用类型
基本类型(值类型):
Number(数字)、String(字符串)、Boolean(布尔)、Symbol(符号)、null(空)、undefined(未定义)
在内存中占据固定的大小,保存在栈内存中。
引用类型(复杂数据类型):
Object(对象)、Function(函数)。其他还有Array(数组)、Date(日期)、RegExp(正则表达式)、特殊的基本包装类型(String、Number、Boolean)以及单体内置对象(Global、Math)等
引用类型的值是对象,保存在堆内存中,栈内存存储的是对象的变量标识符以及对象在堆内存中的存储地址。
JS中的数据类型检测方案
typeof
优点:能够快速区分基本数据类型
缺点:不能将Object、Array和Null区分,都返回Object
console.log(typeof 1) //number
console.log(typeof true) //boolean
console.log(typeof 'mc') //string
console.log(typeof Symbol) //function
console.log(typeof function() {}) //function
console.log(typeof console.log()) //undefined
console.log(typeof []) //object
console.log(typeof {}) //object
console.log(typeof null) //object
console.log(typeof undefined) //unfined
instanceof
优点:能够区分Array、Object、Function,适合用于判断自定义的类实例对象
缺点:Number、Boolean、String基本数据类型不能判断
console.log(1 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
Object.prototype.toString.call()
优点:精准判断数据类型
缺点:写法繁琐不容易记,推荐进行封装后使用
var toString = Object.prototype.toString
console.log(toString.call(1)) //[Object Number]
console.log(toString.call(true)) //[Object Boolean]
console.log(toString.call('mc')) //[Object String]
console.log(toString.call([])) //[Object Array]
console.log(toString.call({})) //[Object Object]
console.log(toString.call(function() {})) //[Object Function]
console.log(toString.call(undefined)) //[Object Undefined]
console.log(toString.call(null)) //[Object Null]