gpt4 book ai didi

javascript - 如何可靠地检查对象是 EcmaScript 6 Map/Set?

转载 作者:数据小太阳 更新时间:2023-10-29 04:01:54 25 4
gpt4 key购买 nike

我只想检查一个对象是 Map 还是 Set 而不是 Array

我使用 lodash 的 _.isArray 检查数组。

function myFunc(arg) {
if (_.isArray(arg)) {
// doSomethingWithArray(arg)
}

if (isMap(arg)) {
// doSomethingWithMap(arg)
}

if (isSet(arg)) {
// doSomethingWithSet(arg)
}
}

如果我要实现 isMap/isSet,它需要看起来像什么?如果可能的话,我希望它能够捕获 Map/Set 的子类。

最佳答案

这种情况类似于正确可靠地检测数组的 ES5 之前的方法。参见 this great article实现 isArray 的可能陷阱。

我们可以使用

  • obj.constructor == Map/Set,但这对子类实例不起作用(并且很容易被欺骗)
  • obj instanceof Map/Set,但这仍然不能跨领域工作(并且可能被原型(prototype)修改所欺骗)
  • obj[Symbol.toStringTag] == "Map"/"Set",但这很容易再次被欺骗。

为了真正确定,我们需要测试一个对象是否有一个[[MapData]]/[[SetData]] 内部插槽。这不是那么容易访问 - 它是内部的。不过,我们可以使用 hack:

function isMap(o) {
try {
Map.prototype.has.call(o); // throws if o is not an object or has no [[MapData]]
return true;
} catch(e) {
return false;
}
}
function isSet(o) {
try {
Set.prototype.has.call(o); // throws if o is not an object or has no [[SetData]]
return true;
} catch(e) {
return false;
}
}

对于一般用途,我建议使用 instanceof - 它简单、易懂、高效,并且适用于大多数合理的情况。或者你马上去鸭子打字,只检查对象是否有 has/get/set/delete/添加/删除方法。

关于javascript - 如何可靠地检查对象是 EcmaScript 6 Map/Set?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29924932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com