在 JavaScript 中检查 Object 是否属于 Map 类型
Check if Object is of type Set in JavaScript
使用instanceof
运算符检查对象是否为 a Set
,例如
myObj instanceof Set
。
如果构造函数的属性出现在对象的原型链中,则instanceof
运算符返回。true
prototype
索引.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
返回的运算符。true
Set
CustomSet
使用(内联框架)
instanceof
时使用运算符是有风险的。在不同的窗口上下文中执行时,测试可能无法正常工作,尤其是在某些较旧的浏览器上。 IFrames
instanceof
作为替代方案,您可以使用 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
考虑鸭子打字的一种简单方法是,我们基本上是在说:
A
Set
具有以下属性/方法。如果一个对象也有这些属性/方法,那么它必须是一个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()
函数的对象包含我们正在检查的属性/方法,我们会返回误报。