如何测试一个变量是Map类型还是Array类型?

5

在ES6中,我如何测试一个变量是否是ArrayMap

instance.constructor.name === 'Map'是一种冒险的做法,即使它是核心类型,在压缩后使用自己的类进行这样的操作会破坏测试。

最可靠的验证该变量是否是Map实例的方法是什么?


3
数组绝不是“映射”,它们是完全不同的结构。 - CertainPerformance
我注意到您编辑了问题,使现有答案无效。这样做是不好的形式,因为它会让读者感到困惑,并让那些编写答案的人看起来像白痴,因为他们的答案不再符合问题。请考虑将您的编辑回滚到以前的版本。 - Jörg W Mittag
6个回答

6

const getType = obj => Object.prototype.toString.call(obj).slice(8, -1);

const isArray = obj => getType(obj) === 'Array';

const isMap = obj => getType(obj) === 'Map';


const arr = [];

console.log(isArray(arr)); // true


const map = new Map();

console.log(isMap(map)); // true


4

您可以使用instanceof。它将返回对象是否为map的true/false。

var a = new Map;
console.log(a instanceof Map);

要检查数组,请使用isArray方法

var a= new Array;
console.log(Array.isArray(a))


如果你在不同的window之间跳转,instanceof将无法工作。我个人不建议这样做。虽然我在最新版本的Chrome中测试过它,它可以正常工作。但在2015年并非如此,因此可能因浏览器而异。 - Kevin Ghadyani

4

不要检查构造函数的.name(字符串)属性,只需检查构造函数本身是否=== Map

const m = new Map();
console.log(m.constructor === Map);


如果您处于不同的“窗口”上下文中,则此方法将无法正常工作。您可能会问自己如何陷入这种情况,但您可能有代码在主窗口中运行,检查新打开窗口中的“Map”。 - Kevin Ghadyani

3
你可以使用 Array.isArray 进行检查,因为 Map 不是一个 Array
要检查实例,可以使用 instanceof 运算符

var array = [],
    map = new Map;
    
console.log(Array.isArray(array)); //  true
console.log(Array.isArray(map));   // false
console.log(array instanceof Map); // false
console.log(map instanceof Map);   //  true


但是它可能是其中之一,那么如何真正测试它是否为地图? - Dimitri Kopriwa
如果你只有一个数组或映射,你可以使用 Array.isArray 进行检查,否则你需要检查实例。 - Nina Scholz

2
您不需要在JavaScript中测试一个Array是否为Map,因为ArrayArray,它永远不可能是Map
实际上,它们甚至不是同一种类型的集合,Array是一个索引集合,而Map是一个键值对集合

不正确。这个问题并不无效。我有一个clone()方法,可以传递任何东西给它。我想知道它是一个Map、Set还是一个Array(或者其他无数的东西)。这是一个有效的问题。我确实需要测试它。 - Ryan Shillington
问题在我回答之后被编辑成了不同的内容。显然,当我回答时,我不可能知道问题会被改成不同的东西,因为那时问题还没有被改变。我的答案对于当时提出的问题是有效的。以一种使现有答案无效的方式更改问题被认为是 SO 上的不良风格,我将要求 OP 恢复编辑。不幸的是,当问题被更改时,回答者不会收到通知。感谢您让我注意到这一点。 - Jörg W Mittag
仅供参考,在我回答这个问题的时候,问题是“在ES6中,如何测试一个Array是否为Map?” 我相信我的答案是100%正确的:一个Array始终是一个Array而不是一个Map,因此没有必要测试一个Array是否为Map - Jörg W Mittag
我还要指出的是,现在的问题毫无意义:主题行询问如何测试变量的类型,但在ECMAScript中变量没有类型。(例如,在TypeScript中有类型,但问题不是关于TypeScript的。) - Jörg W Mittag
typeof 运算符告诉你一个 的类型,而不是一个 变量 的类型。在 ECMAScript 中,变量没有类型,只有值有类型。 - Jörg W Mittag
显示剩余2条评论

1
在 JavaScript 中,数组永远不能成为 Map。但你可能会混淆它与对象或映射。要检查 JavaScript 变量是否为 Map,可以使用 instanceof
instance instanceof Map

为了测试变量是否是数组的实例,您可以编写Array.isArray(instance)

var instance = new Map;
console.log(instance instanceof Map); // true
console.log(instance instanceof Array); //false


不正确。这个问题并不无效。我有一个clone()方法,可以传递任何东西给它。我想知道它是一个Map、Set还是Array。这是一个有效的问题,你的答案(包括在其他窗口/上下文中的instanceof部分)完全是错误的。 - Ryan Shillington

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接