如何在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