js的数据类型分为基本数据类型和引用数据类型
- 基本数据类型就是值类型,都是存储一些简单的数据,它存储在栈内存中,变量赋值之后,相互独立,互不影响。如字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol。
- 引用数据类型的数据是存储在堆内存中,指的是那些可能由多个值构成的对象,赋值时,复制的是对象的引用,即赋值前后,变量指向同一个指向同一个引用对象。如对象(Object)、数组(Array)、函数(Function)
字符串(String)、数字(Number)、布尔(Boolean)、未定义(Undefined)、函数(Function)
这些直接用typeof可检测类型
var str = '1234'
var bool = true
var num = 3
var undef
var fuc = function () {
return 'yueuewiwo'
}
console.log(`字符串:${typeof str}`)
console.log(`布尔类型:${typeof bool}`)
console.log(`数字:${typeof num}`)
console.log(`Undefined:${typeof undef}`)
console.log(`函数:${typeof fuc}`)对于像 对象(Object)、数组(Array)、对空(Null)这种类型的数据,typeof往往是检测不到的,亲测:
var nul = null
var arr = [1,2,5,6]
var obj = { a: 'name', b: '13'}
console.log(`nul: ${typeof nul}`)
console.log(`数组: ${typeof arr}`)
console.log(`对象:${typeof obj}`)
打印结果:
nul: object
数组: object
对象:object所以,像Object、Array、Null这种,我们要怎么检测数据类型呢?
对象类型的检测
Array数组的监测有2种方式, Array.isArray 或者 Object.prototype.toString.call
Array.isArray是ECMAScript 2015中新增的属性,专门用来判断要检测的值是否是数组的
var arr = [1,2,5,6]
var obj = { a: 'name', b: '13'}
console.log(`数组: ${Array.isArray(arr)}`)
console.log(`对象:${Array.isArray(obj)}`)
打印结果:
数组: true
对象:false你以为这样就OK了吗?NO......在IE8及以下的浏览器上,检测是无效的,因为IE9才支持isArray属性
由于array和object都是对象类型,其构造函数在实现时,各自实现了自身的prototype.toString方法,屏蔽了原型链上Object.prototype.toString() 方法。
var arr = [1,2,5,6]
var obj = { a: 'name', b: '13'}
console.log(`数组 -- prototype.toString: ${Object.prototype.toString.call(arr)}`)
console.log(`对象 -- prototype.toString: ${Object.prototype.toString.call(obj)}`)
打印结果:
数组: [object Array]
对象:[object object]getType(p) { return Object.prototype.toString.call(p) // returns [object type]}
每个对象都有一个 toString() 方法,当该对象被表示为一个文本值时,或者一个对象以预期的字符串方式引用时自动调用。默认情况下,toString() 方法被每个 Object 对象继承。如果此方法在自定义对象中未被覆盖,toString() 返回 "[object type]",其中 type 是对象的类型。
var nul = null
Object.prototype.toString.call(nul) // returns [object Null]ps:判断是否是date类型可以用p instanceof Date 判断