typeof 是否能正确判断类型?
typeof 并不能够准确判断类型,对于基本数据类型来说,除了null之外,都能正确的显示类型
但是对于对象来说typeof不能准确判断类型,typeof 函数会返回function,除此之外全部都是object,不能准确判断类型
console.log(typeof '');//string
console.log(typeof []);//object
console.log(typeof {});//object
console.log(typeof 1);//number
console.log(typeof null);//object
console.log(typeof undefined);//undefined
console.log(typeof true);//boolean
console.log(typeof function(){});//function
console.log(typeof /\d/);//object
所以判断对象数据类型时不应该用typeof,而应该用
instanceof,instanceof是基于原型链判断对象的,可以判断复杂的对象
console.log([] instanceof Array);//true
console.log({} instanceof Object);//true
console.log(/\d/ instanceof RegExp);//true
console.log(function(){} instanceof Object);//true
console.log(function(){} instanceof Function);//true
instanceof能否判断基本数据类型?
这里在网上没找到合适的方法,借鉴学长的
class PrimitiveNumber {
static [Symbol.hasInstance](x) {
return typeof x === 'number'
}
}
console.log(111 instanceof PrimitiveNumber) // true
这里的
Symbol.hasInstance用于判断某对象是否为某构造器的实例,当其他对象使用instanceof运算符,判断是否为该对象的实例时,会调用这个方法。学长说:“其实就是自定义
instanceof行为的一种方式,这里将原有的instanceof方法重定义,换成了typeof,因此能够判断基本数据类型”
能不能手动实现一下instanceof的功能?
规则:
instanceof用于判断某个对象是否是另一个对象(构造方法)的实例。instanceof会查找**原型链**,直到null如果还不是后面这个对象的实例的话就返回false,否则就返回true
function instanceofFunc(obj, cons) {
// 错误判断 构造函数必须是一个function 其他的均报错
if (typeof cons !== 'function') throw new Error('instance error')
if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) return false
// 获取到原型对象
let proto = cons.prototype
// 如果obj的原型对象不是null
while (obj.__proto__) {
if (obj.__proto__ === proto) return true
obj = obj.__proto__
}
return false
}
console.log(instanceofFunc(() => {}, Function)) // true
//原型链的内容链接了掘金的讲解,看起来蛮不错的!