检查 Object 是否属于 JavaScript 中的 Set 类型

在 JavaScript 中检查 Object 是否属于 Map 类型

Check if Object is of type Set in JavaScript

使用instanceof运算符检查对象是否为 a Set,例如
myObj instanceof Set

如果构造函数的属性出现在对象的原型链中,则instanceof运算符返回。trueprototype

索引.js
const set = new Set(); set.add('JavaScript'); console.log(set instanceof Set); // 👉️ true console.log('test' instanceof Set); // 👉️ false console.log({} instanceof Set); // 👉️ false

我们使用
instanceof
运算符来检查
set变量

在其原型链中是否具有
Set() 构造函数的原型属性。

如果您扩展类,这种方法也适用Set

索引.js
class CustomSet extends Set { example() { console.log('do work'); } } const set = new CustomSet(); set.add('JavaScript'); console.log(set instanceof Set); // 👉️ true console.log(set instanceof CustomSet); // 👉️ true console.log({} instanceof CustomSet); // 👉️ false

在此示例中,我们扩展了Set对象和instanceof返回的运算符trueSetCustomSet

使用(内联框架)instanceof时使用运算符是有风险的。在不同的窗口上下文中执行时,测试可能无法正常工作,尤其是在某些较旧的浏览器上。 IFramesinstanceof

作为替代方案,您可以使用 duck-typing 来检查对象是否是Set.

索引.js
function isSet(set) { if ( set && typeof set.add === 'function' && typeof set.clear === 'function' && typeof set.delete === 'function' && typeof set.has === 'function' ) { return true; } return false; } const set = new Set(); console.log(isSet(set)); // 👉️ true const map = new Map(); console.log(isSet(map)); // 👉️ false console.log(isSet({})); // 👉️ false

考虑鸭子打字的一种简单方法是,我们基本上是在说:

ASet具有以下属性/方法。如果一个对象也有这些属性/方法,那么它必须是一个Set.

在我们的isSet函数中,我们检查传入的参数是否具有 a
Set将具有的方法,如果满足条件,我们返回true

如果将不是 aSet但包含这些相同方法的对象传递给函数,则可能会出错。

索引.js
function isSet(set) { if ( set && typeof set.add === 'function' && typeof set.clear === 'function' && typeof set.delete === 'function' && typeof set.has === 'function' ) { return true; } return false; } // 👇️ true console.log( isSet({ add: () => {}, clear: () => {}, delete: () => {}, has: () => {}, }), );

如果传递给isSet()函数的对象包含我们正在检查的属性/方法,我们会返回误报。