问题引入:
那么 JavaScript 中 instanceof
和 typeof
有啥区别呢?
typeof
用法:typeof operand
;是个一元运算符,就像 !
逻辑非运算符,它会返回以字符串表示操作数的类型。
typeof一般只能返回如下几个结果:number, boolean, string, function(函数), object(null,数组,对象), undefined。
📌注意
1、关于 typeof
有一处比较特殊 typeof null === 'object'
2、对于数组 typeof [1, 2, 4] === 'object';
所以使用 typeof
并不能区分是 Object
还是 Array
类型,如果要进行区分,可以通过以下几种方法:
Array.isArray
Object.prototype.toString.call
123var arr = [], obj = {};Object.prototype.toString.call(arr) === '[object Array]' // trueObject.prototype.toString.call(obj) === '[object Object]' // true❗️
instanceof
注意: 使用instanceof
判断时要特别注意:123456789101112131415var arr = [], obj = {};// 以下两行代码都是返回 truearr instanceof Array // truearr instanceof Object // trueobj instanceof Object // true// 判断是 `Array` 类型function _isArray(arr) {return arr instanceof Array;}// 判断是 `Object` 类型function _isObject(obj) {return obj instanceof Object && !(obj instanceof Array);}
3、对正则表达式字面量的类型判断在某些浏览器中不符合标准:
constructor
constructor
是所有对象原型对象中的一个属性,其指向创建该对象实例的构造函数。
1、对于原始类型:
2、对于引用类型:
3、对于自定义对象:
📌注意:对象的 constructor
属性返回的是一个构造函数的引用,但是由于 constructor
是原型对象中的一个属性,所以当修改原型对象时,可能就会导致 constructor
发生变化。
instanceof
instanceof
用法:object instanceof constructor
;是个二元运算符,用于判断一个引用类型对象,在其原型链中,是否存在一个原型的构造函数为 constructor
。
所以对于上一章节中的例子:
📌注意:对于原始类型,一直返回 false
。
总结
1、对于文章开头案例,在 JavaScript 中的字符串可能是字符串字面量(primitive type),也可能是字符串对象(non-primitive type),所以在判断一个变量是否是字符串时,可以使用如下方法:
2、何时用 typeof
,何时用 instanceof
- 对于原始类型(primitive type),使用
typeof
- 对于判断一个对象是否是其父类型的实例,使用
instanceof
- 对于原始类型,使用
instanceof
一直返回false
typeof
一般只能返回如下几个结果:number, boolean, string, function(函数), object(null,数组,对象), undefined
参考链接
Understanding typeof, instanceof and constructor in JavaScript
Why does instanceof return false for some literals?