typeof
概念:typeof
运算符返回一个字符串,表示操作数的类型。
用法:
js
typeof 1 // 'number'
typeof '1' // 'string'
typeof undefined // 'undefined'
typeof 的结果可以看下图:

这个图中可以看出, null比较出乎意料,并且typeof区分不了对象和null
typeof null 为什么返回object
在 JavaScript 最初的实现中,JavaScript 中的值是由一个表示类型的标签和实际数据值表示的。对象的类型标签是 0。由于 null
代表的是空指针(大多数平台下值为 0x00),因此,null 的类型标签是 0,typeof null
也因此返回 "object"
。
instanceof
概念:instanceof
运算符 用于检测构造函数的 prototype
属性是否出现在某个实例对象的原型链上。 返回的是bool。
如果你了解原型和原型链的情况下,这个概念还是很好理解的。
用法:
js
// 定义构建函数
let Car = function() {}
let benz = new Car()
benz instanceof Car // true
let car = new String('xxx')
car instanceof String // true
let str = 'xxx'
str instanceof String // false
在面试的过程中,极有可能会被问到 instanceof如何实现?
javascript
function myInstanceof(left, right) {
// 如果是基础类型,直接返回false
if(typeof left !== 'object' || left === null) return false;
// getProtypeOf能够拿到left的原型对象
let proto = Object.getPrototypeOf(left);
//循环遍历原型链,直到找到相同原型对象,返回true
while(true) {
if(proto === null) return false;
if(proto === right.prototype) return true;
proto = Object.getPrototypeof(proto);
}
}
话术总结
typeof和instanceof都是用于检测数据类型的操作符。
typeof
返回一个字符串,表示操作数的基本数据类型(如"number"
、"string"
、"object"
),但对null
和数组返回"object"
,对函数返回"function"
,无法区分具体对象类型。instanceof
通过原型链检查对象是否属于某个构造函数的实例(如arr instanceof Array
返回true
),适用于检测引用类型(如数组、自定义对象),但无法检测基本类型(如1 instanceof Number
返回false
)。
简言之,typeof
适合判断基本类型(除 null
外),而 instanceof
用于检测对象的具体实例类型。