我们知道判断数据类型可以用typeof
定义一些数据
let num=1,str='str',bool=true,obj={},arr=[],sy=Symbol('s'),g,reg=/test/,date=new Date()
typeof运算符
typeof num //"number"
typeof str //"string"
typeof bool //"boolean"
typeof g //"undefined"
typeof obj //"object"
typeof arr //"object"
typeof reg//"object"
typeof date //"object"
typeof null //"object"
可以看出来typeof 对基本类型(除了null)可以判断出类型,但是对应对象,没有办法知道具体的类型
instanceof 判断是否为每个类型的实例,通过这个方法可以判断出类型,我们对上述数据进行判断
function Person(){}
let p=new Person()
function Foo(){}
let f=new Foo()
num instanceof Number //false
str instanceof String //false
arr instanceof Object //true
arr instanceof Array //true
obj instanceof Object //true
obj instanceof Array //false
reg instanceof RegExp //true
date instanceof Date //true
constructor
arr.constructor ===Array //true
obj.constructor ===Object //true
str.constructor === String //true
从输出的结果我们可以看出,除了undefined和null,其他类型的变量均能使用constructor判断出类型。
不过使用constructor也不是保险的,因为constructor属性是可以被修改的,会导致检测出的结果不正确
Object.prototype.toString.call
Object.prototype.toString.call(str) //"[object String]"
Object.prototype.toString.call(obj) //"[object Object]"
Object.prototype.toString.call(null) //"[object Null]"
Object.prototype.toString.call(num) ///"[object Number]"
...
每个对象都有一个toString()方法,当该对象被表示为一个文本值时,或者一个对象以预期的字符串方式引用时自动调用。默认情况下,toString()方法被每个Object对象继承。如果此方法在自定义对象中未被覆盖,toString() 返回 "[object type]",其中type是对象的类型
那为什么Object.toString.call(params) 会报错呢?
Object.toString.call(num)
Uncaught TypeError: Function.prototype.toString requires that 'this' be a Function at Number.toString (<anonymous>) at <anonymous>:1:17
这是为什么呢,因为Object为构造函数,Object构造函数本身没有toString方法。
依照原型链关系,Object构造函数的上游原型链是Function.prototype。
所以,你调用Object.toString.call(param)本质上是调用Function.prototype.toString.call(param),这里需要的参数类型是函数,所以会报错。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。