在 ES8 中,更新了 typeof
和 instanceof
操作符的行为,使得它们支持了新出现的数据类型,例如将 typeof symbol
识别为 "symbol",将 instanceof Promise
识别为 true。
然而,这种行为更新也引入了一个潜在的问题,就是使用 instanceof
操作符时容易出现 TypeError
。这篇文章将会为你详细介绍这个问题,以及如何解决这个问题。
什么时候会出现 TypeError?
在 ES8 中,instanceof
操作符在检查对象的类型时,它实际上是检查原型链中是否出现过目标类型的构造函数。如果目标类型的构造函数不是一个函数或者不是对象,则 TypeError
就会被抛出,这就是在 ES8 中的 instanceof
的行为。
下面是一个出现 TypeError 的例子:
const obj = {}; obj instanceof null; // TypeError
在这个例子中,我们要判断 obj
是否是 null
类型的对象,然而 null
并不是一个函数或者对象,所以会出现 TypeError。
如何解决 TypeError 问题?
出现 TypeError
的问题是由对 instanceof
的错误使用导致的,所以我们需要改变我们对 instanceof
的使用方式。
首先,我们需要检查目标类型的构造函数是否存在。如果目标类型不存在,我们可以直接返回 false
,因为不存在的类型是不可能被 instanceof
判断为 true 的。
其次,我们需要检查判断的对象是否为 null。如果是 null 的话,我们就需要手动判断它是否为当前类型,因为 null 本身并不是一个对象,它只能被视为一个对象,所以 instanceof
无法识别。
最后,我们需要按照正常的流程检查对象的原型链,如果原型链中存在目标类型的构造函数,我们就返回 true,否则返回 false。
下面是一个针对这个问题改进的 instanceof
实现:
// javascriptcn.com 代码示例 function myInstanceOf(obj, type) { if (typeof type !== 'function' && typeof type !== 'object' || type === null) { return false; } if (obj === null) { return type === null; } const prototype = Reflect.getPrototypeOf(obj); if (prototype === null) { return false; } if (prototype === type.prototype) { return true; } return myInstanceOf(prototype, type); }
总结
在 ES8 中,instanceof
操作符在检查对象类型时可能会出现 TypeError
的问题。我们可以通过检查目标类型的构造函数是否存在,检查判断的对象是否为 null,以及按照正常的流程检查对象原型链来解决这个问题。这个修改后的实现可以有效地解决这个问题,让我们在使用 instanceof
时更加可靠和安全。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/654a14e97d4982a6eb446e2d