如何在JavaScript中使用instanceof操作符检查原始值?

JavaScript提供了两个用于类型检查的操作符:

  • typeof用于检查原始值的类型
  • instanceof用于检查类实例的类型

原始值无法使用instanceof操作符,这有点令人失望。更糟糕的是,JavaScript的内置对象(如BooleanStringNumber)只能与instanceof一起使用,以检查使用相应构造函数创建的实例。此外,typeof还有一些怪异之处,进一步复杂化了问题,比如typeof null返回'object'

然而,仍然有希望可以使用instanceof检查原始值。Symbol.hasInstance允许我们自定义instanceof操作符的行为。但是,为了做到这一点,我们需要为每种原始类型定义一个class。下面是具体的实现:

class PrimitiveNumber {
  static [Symbol.hasInstance] = x  => typeof x === 'number';
}
123 instanceof PrimitiveNumber; // true

class PrimitiveString {
  static [Symbol.hasInstance] = x => typeof x === 'string';
}
'abc' instanceof PrimitiveString; // true

class PrimitiveBoolean {
  static [Symbol.hasInstance] = x => typeof x === 'boolean';
}
false instanceof PrimitiveBoolean; // true

class PrimitiveSymbol {
  static [Symbol.hasInstance] = x => typeof x === 'symbol';
}
Symbol.iterator instanceof PrimitiveSymbol; // true

class PrimitiveNull {
  static [Symbol.hasInstance] = x => x === null;
}
null instanceof PrimitiveNull; // true

```javascript
class PrimitiveUndefined {
  static [Symbol.hasInstance] = x => x === undefined;
}
undefined instanceof PrimitiveUndefined; // true
class PrimitiveUndefined {
  static [Symbol.hasInstance] = x => x === undefined;
}
undefined instanceof PrimitiveUndefined; // true