【问题标题】:How to check if object or var is traversable in Javascript?如何检查对象或变量是否可以在 Javascript 中遍历?
【发布时间】:2016-09-05 13:23:28
【问题描述】:

如何检查对象或变量在 Javascript 或 jQuery 中是否可遍历?

可遍历的对象或变量必须在 for each 中工作,例如 jQuery 中的 object.forEach()$.each(object, callback)

实际上我想验证它,然后在每个循环中使用它。

更新:

我正在寻找的解决方案是这样的:

if(is_traversable($var)) {
    $var.forEach(function(value, key) {
        console.log(value);
    }
}

你可以给我一个is_traversable()函数的实现。

【问题讨论】:

  • JavaScript 中没有 for each 循环。你的意思是for of
  • @Bergi Javascript 中有用于数组的 forEach() 方法。查看更多w3schools.com/jsref/jsref_forEach.asp
  • 当然,但这只是一种方法而不是循环。任何对象都可以有一个具有该名称的方法。还是您在寻找阵列?那你应该要求那个。
  • @Bergi for(对象中的 var 属性){}
  • 你可以像这样枚举所有对象的属性

标签: javascript jquery traversable


【解决方案1】:

对于数组,使用Array.isArray();对于对象,您可以先检查nulltypeof 是否等于'object''function'

它想要的功能:

var isTraversable = o => Array.isArray(o)
     || o !== null && ['function', 'object'].includes(typeof o);

console.log(isTraversable());               // false
console.log(isTraversable(undefined));      // false
console.log(isTraversable(null));           // false
console.log(isTraversable(''));             // false
console.log(isTraversable(0));              // false
console.log(isTraversable('a'));            // false
console.log(isTraversable(42));             // false
console.log(isTraversable(/./));            // false
console.log(isTraversable([]));             // true
console.log(isTraversable([1]));            // true
console.log(isTraversable({}));             // true
console.log(isTraversable({ a: /./ }));     // true
console.log(isTraversable(function () {})); // true
console.log(isTraversable(() => true));     // true
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 同样可以使用 typeof 来检测类型。我相信数组会作为对象列出,所以要小心。
  • null 是一个对象,不可迭代。
  • @NinaScholz null 不是对象。显然typeof null 在输出 'object' 时是 ecmascript 中的一个错误
  • 其实有一个提议做typeof null == "null",被拒绝了:wiki.ecmascript.org/doku.php?id=harmony%3atypeof_null
  • 这是不可遍历的:{} 和 [],因此您还需要检查长度,或者在对象为正确类型之后,使用 for(var p in o){ 检查对象内部是否有任何内容返回真; }。当字符串不为空时,它也是可遍历的。对象也可以是基本类型,如布尔值或数字。这些是不可遍历的。
【解决方案2】:

您可以使用以下内容并创建适当的函数/验证:

var myArray = ["This is a test"];
var myObject = {"test" : "This is a test"};

if( Object.prototype.toString.call( myArray ) === '[object Array]' ) {
    alert( 'Array!' );
}

if( Object.prototype.toString.call( myObject ) === '[object Object]' ) {
    alert( 'Object!' );
}

看看这个:Object.toString

【讨论】:

    【解决方案3】:

    forEach 和朋友以通用方式实现,符合条件,他们的论点

    • 必须支持 getter 运算符 ([])
    • 并且必须具有数字 length 属性。

    也就是说,任何带有.length 的字符串和对象都可以工作:

    isIterable = x => x && !isNaN(x.length);
    

    请注意,for..offorEach 不同,它明确要求参数具有 Symbol.iterator

    a = {
        length: 10,
        5: 555
    };
    
    [].forEach.call(a, x => console.log(x)); // fine
    
    for(var x of a) console.log(x); // no way

    【讨论】:

      【解决方案4】:

      items 可能是 Array Object, variable

      示例

      项目 = [1,2,3,4]; items = { name: 'abc', email: 'abc@xyz.com'}

      var items;
      
      if (items && items instanceof Array) { // if Array
        items.forEach(function(value) {
          console.log(value);
        });
      } else if (items && items instanceof Object) { // if Object
        for (key in items) {
          console.log(items[keys]);
        }
      } else { // if variable 
        console.log(items);
      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-20
        • 1970-01-01
        • 1970-01-01
        • 2023-01-27
        • 1970-01-01
        • 1970-01-01
        • 2012-09-22
        • 2015-03-20
        相关资源
        最近更新 更多