如何在JavaScript中使用instanceof操作符检查原始值?
JavaScript提供了两个用于类型检查的操作符:
typeof用于检查原始值的类型instanceof用于检查类实例的类型
原始值无法使用instanceof操作符,这有点令人失望。更糟糕的是,JavaScript的内置对象(如Boolean、String和Number)只能与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