138

MDN ドキュメント: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of

このfor...of構造は、「反復可能な」オブジェクトを反復できるように記述されています。しかし、オブジェクトが反復可能かどうかを判断する良い方法はありますか?

配列、イテレータ、およびジェネレータに共通のプロパティを見つけようとしましたが、見つけることができませんでした。

for ... oftry ブロックで a を実行して型エラーをチェックする以外に、これを行うクリーンな方法はありますか?

4

10 に答える 10

191

反復可能性を確認する適切な方法は次のとおりです。

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

これが機能する理由 (反復可能なプロトコルの詳細): https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Iteration_protocols

for..of について話しているので、ES6 の考え方をしていると思います。

また、文字列は文字列を繰り返し処理するため、 が文字列のtrue場合にこの関数が返すことにも驚かないでください。obj

于 2015-09-12T12:37:13.343 に答える
30

なぜそんなに冗長なのですか?

const isIterable = object =>
  object != null && typeof object[Symbol.iterator] === 'function'
于 2016-06-15T14:09:01.200 に答える
0

チェックを探していてfor ... in、以下に決めました。

isIterable (value) {
  // add further checks here based on need.
  return Object.keys(Object(value)).length > 0
}

これはtrue、反復可能で、少なくとも 1 つの値を持つものに対して返されます。したがって、空の文字列、空の配列、空のオブジェクトなどは を返しfalseます。しかし、{a: 'x', b:'y'}戻りtrueます。

于 2020-10-20T17:28:22.803 に答える