js 的数据类型
JavaScript的数据类型分为两种:原始类型(即基本数据类型)和对象类型(即引用数据类型):
基本类型:String、Number、Boolean、Null、Undefined、Symbol(es6)
引用类型:Object、Array、Function
一 typeof
用来说明变量的数据类型
typeof是一个运算符,其有两种使用方式:
(1)typeof(表达式);
(2)typeof 变量名;
返回值是一个字符串,用来说明变量的数据类型;
所以可以用此来判断number, string, object, boolean, function, undefined, symbol 这七种类型,
每种情况返回的内容如下表所示
typeof有一定的局限性:对于对象、数组、null 以及函数的实例(new + 函数)返回的值是 object。
比如typeof(window),typeof(document),typeof(null) 返回的值都是object,
二 instanceof
用于判断一个变量是否某个对象的实例
instanceof运算符用于检测构造函数的 prototype属性是否出现在某个实例对象的原型链上,
返回值为布尔值,用于指示一个变量是否属于某个对象的实例。其语法如下所示:
object instanceof constructor
instanceof 主要的实现原理就是只要右边变量的 prototype 在左边变量的原型链上即可。
因此,instanceof 在查找的过程中会遍历左边变量的原型链,直到找到右边变量的 prototype,如果查找失败,则会返回 false.
instanceof 可以准确地判断复杂引用数据类型,但是不能正确判断基础数据类型。
instanceof用来判断对象,可以对不同的实例对象进行判断,判断方法是根据对象的原型链依次向下查询,如果obj2的原型属性存在于obj1的原型链上,代码形式(obj1 instanceof obj2)(判断obj1是否为obj2的实例),obj2必须为对象,否则会报错。返回的是布尔值。
可以看到,上述两种方法都有弊端,并不能满足所有场景的需求
如果需要通用检测数据类型,可以采用Object.prototype.toString,调用该方法,统一返回格式“[object Xxx]”的字符串,代码形式,如下:
Object.prototype.toString({}) // "[object Object]"
Object.prototype.toString.call({}) // 同上结果,加上call也ok
Object.prototype.toString.call(1) // "[object Number]"
Object.prototype.toString.call('1') // "[object String]"
Object.prototype.toString.call(true) // "[object Boolean]"
Object.prototype.toString.call(function(){}) // "[object Function]"
Object.prototype.toString.call(null) //"[object Null]"
Object.prototype.toString.call(undefined) //"[object Undefined]"
Object.prototype.toString.call(/123/g) //"[object RegExp]"
Object.prototype.toString.call(new Date()) //"[object Date]"
Object.prototype.toString.call([]) //"[object Array]"
Object.prototype.toString.call(document) //"[object HTMLDocument]"
Object.prototype.toString.call(window) //"[object Window]"