【问题标题】:Check if object is collection/iterable?检查对象是否是集合/可迭代的?
【发布时间】:2015-05-05 19:05:40
【问题描述】:

我必须在构造函数中初始化一个对象集合,并且我想支持所有集合类型,例如数组、映射和集合。 typeof 只会返回 Object 并且似乎没有通用的 Collections 实用程序对象可以提供像 Array.isArray() 这样的功能。

来自 Java 和经典继承风格,我的下一个冲动是检查对象的继承。然而,我对各种原型函数的实验并没有出现任何结果。我能想到的最好的办法是创建一个函数来检查 .prototype.isPrototypeOf(object) 中的 Map、Set 和 Array。但这可能是因为我实际上并不了解 Javascripts 原型继承。

有没有更好的方法来检查一个对象是否是一个集合?

【问题讨论】:

    标签: javascript inheritance collections


    【解决方案1】:

    你可以检查它是否是Iterable

    function isIterable(obj) {
      if (obj == null) {
        return false;
      }
      return typeof obj[Symbol.iterator] === 'function';
    }
    

    MDN web docs - Iteration protocols

    【讨论】:

      【解决方案2】:

      我想出了以下 hack,IE 11 及更高版本应该支持它:

      if(typeof collection !== "undefined" && typeof collection.forEach !== "undefined"){
        collection.forEach(function(value, param2, collection){
          //do stuff
        }, this);
      }
      

      param2 对于每个集合类型是不同的:对于 Arrays 它是索引,对于 Maps 它是键,而 Sets 只是重复相同的值以匹配 Maps 和 Arrays 的函数签名。

      this 参数将匿名函数的 this 分配给外部函数的 this - 启用对在外部函数中分配的变量的引用。否则默认为全局window

      我强烈希望直接测试对象的继承或基于标准的 Collections.isCollection 类型对象,并将选择一个新答案。

      【讨论】:

      • 你应该明确检查typeof collection == "object" && typeof collection.forEach == "function"
      • 并在那里进行空检查:p
      • 使用collection != null 而不是typeof collection !== "undefined" 来检查nullundefined
      猜你喜欢
      • 2019-12-09
      • 1970-01-01
      • 2023-03-10
      • 2011-01-24
      • 1970-01-01
      • 2013-09-23
      • 1970-01-01
      • 2022-07-05
      • 1970-01-01
      相关资源
      最近更新 更多