【问题标题】:How to test that a variable is type Map or Array?如何测试变量是 Map 还是 Array 类型?
【发布时间】:2019-02-23 11:31:35
【问题描述】:

在 ES6 中,如何测试变量是 Array 还是 Map

instance.constructor.name === 'Map' 是一个冒险的习惯,即使它是核心类型,在缩小时使用自己的类执行此操作会破坏测试。

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

【问题讨论】:

  • 数组从不Map,它们是完全不同的结构。
  • 我注意到您以一种使现有答案无效的方式编辑了您的问题。这样做是不好的形式,因为它会使读者感到困惑,并使写这些答案的人看起来像白痴,因为他们的答案不再与问题相符。请考虑将您的编辑回滚到以前的版本。

标签: javascript arrays ecmascript-6 maps


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 如果您处于不同的 window 上下文中,这将不起作用。您可能会问自己在这种情况下是如何度过的,但您可能会在主窗口中运行代码来检查新打开的窗口中的Map
    【解决方案3】:

    您可以使用instanceof。如果对象是地图,它将返回真/假

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

    使用 isArray 方法检查数组

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

    【讨论】:

    • instanceof 如果您在不同的window 等上下文之间跳转,则将不起作用。我个人不推荐它。虽然,我在最新的 Chrome 中对其进行了测试;它工作正常。 2015 年的情况并非如此,因此可能会因浏览器而异。
    【解决方案4】:

    您不需要在 JavaScript 中测试 Array 是否是 Map,因为 ArrayArray,它永远不可能是 Map

    事实上,它们甚至不是同一种集合,Arrayindexed collection,而 Mapkeyed collection

    【讨论】:

    • 不正确。这个问题不是无效的。我有一个clone() 方法,可以将任何东西传递给它。我想知道它是 Map、Set 还是 Array(或一百万个其他东西)。这是一个有效的问题。我确实需要测试它。
    • 这个问题被编辑以提出不同的问题我写下我的答案。显然,当我写下我的答案时,我不可能知道问题会变成不同的东西,当时问题还没有改变。我的回答适用于我回答时提出的问题。以使现有答案无效的方式更改问题在 SO 上被认为是不好的风格,我将要求 OP 回滚编辑。不幸的是,问题更改时不会通知回答者。感谢您提请我注意。
    • 作为参考,在我回答问题时,问题是“在 ES6 中,如何测试 Array 是否为 Map?”而且我相信我的答案是 100% 正确的:Array 始终是 Array 而不是 Map,因此没有必要测试 Array 是否是 Map
    • 我还要注意现在的问题没有意义:主题行询问如何测试变量的类型,但变量在 ECMAScript 中没有类型。 (例如,他们使用 TypeScript,但问题不在于 TypeScript。)
    • 哦。我没有意识到问题已经改变了。我明白了。
    【解决方案5】:

    您可以使用Array.isArray 检查,因为Map 不是Array

    要检查实例,您可以使用instanceof operator

    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

    【讨论】:

    • 但它可以是一个或另一个,要真正测试它是否是一张地图?
    • 如果你只有一个数组或者一个map,你可以带Array.isArray,否则你需要检查实例。
    【解决方案6】:

    Array 可以是 JavaScript 中的 Map。但是,您可能会对 Object 或 map 感到困惑。要检查 javascript 变量是否为 Map,您可以使用 instanceof

    instance instanceof Map
    

    要测试变量是不是一个Array的实例,可以写Array.isArray(instance)

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

    【讨论】:

    • 不正确。这个问题不是无效的。我有一个clone() 方法,可以将任何东西传递给它。我想知道它是 Map、Set 还是 Array。这是一个有效的问题,您的答案(包括其他窗口/上下文中的instanceof 部分)完全错误。
    猜你喜欢
    • 2017-08-06
    • 2023-02-06
    • 2021-03-17
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多