es6 はオブジェクトをトラバースできますか?
es6 の「for of」はオブジェクトを横断できません。理由: Iterator インターフェイスは ES6 で導入されました。「for-of」を使用して走査できるのは、Iterator インターフェイスを提供するデータ型のみです。一方、通常のオブジェクトはデフォルトで Iterator インターフェイスを提供しないため、「for-of」は横断。
このチュートリアルの動作環境: Windows 7 システム、ECMAScript バージョン 6、Dell G3 コンピューター。
フロントエンドの継続的な開発に伴い、for、forEach、do..while、for...in などの多くのライト ループのメソッドが登場しました。ただし、これらのループにも独自のループがあります。アプリケーションシナリオと利点と欠点。
ES6 は、文字列、配列、その他の配列のようなオブジェクトをループできる新しいループ メソッド for...of を提供します。最も一般的な Object オブジェクトであるため、ループできるのは当然です。
以下のコード例を見てみましょう:
{ // 迭代数组 const iterable = ['a', 'b']; for (const value of iterable) { console.log(value); } // output: a b } { // 普通对象 const obj = { a: 'A', b: 'B' } for(const item of obj){ console.log(item) } // Uncaught TypeError: obj is not iterable }
ああ、エラーが報告されました: Uncaught TypeError: obj is not iterable
。ヒント: obj は反復可能ではないため、for...of
を直接使用して Object オブジェクトを走査することはできません。
では、ほとんどのデータ構造を横断できる for...of が Object オブジェクトを横断できないのはなぜでしょうか?
理由:
Iterator は ES6 で導入されました。for-of、while Array のループに使用できるのは、Iterator インターフェイスを提供するデータ型のみです。 Set、Map などのデータ型、および引数などの特定の配列はすべてデフォルトで Iterator インターフェイスを提供するため、for-of を使用して走査できます。
通常のオブジェクトの場合、for...of 構造体を直接使用することはできず、エラーが報告され、obj は反復可能ではありません
というプロンプトが表示されます。これは、通常のオブジェクトが反復可能であることを意味します。デフォルトでは Iterator インターフェイスがありません。Iterator インターフェイスを使用するには、事前に展開する必要があります。
それにどう対処すればよいでしょうか? for-of でオブジェクトを走査しましょう
理由は明らかですが、どうすれば解決できますか?オブジェクトやその他のデータ型に Iterator インターフェイスを提供できますか?
答えは「はい」です。ES6 では Symbol.iterator 属性も提供されます。データ構造にこの属性がある限り、データ構造は、 Iterator インターフェイス。次に、このインターフェイスを実装する方法があります。以下が最も単純な実装です:
newObj[Symbol.iterator] = function(){ let index = 0 , self = this , keys = Object.keys( self ) ; return { next(){ if( index < keys.length ){ return { value: self[keys[index++]] , done: false }; } else{ return { value: undefined , done: true } } } }; };
注意深く見ると、Symbol.iterator インターフェイスが実際には Generator 関数であることがわかります。コードを簡略化します:
newObj[Symbol.iterator] = function* (){ let keys = Object.keys( this ) ; for(let i = 0, l = keys.length; i < l; i++){ yield this[keys[i]]; } } for(let v of newObj){ console.log( v ); } // 输出结果 // 5 // 6
注目に値するのは、Object.keys が for-in が遭遇する継承の問題をたまたま解決する前に
これは私たちの期待を満たしており、for-of を使用してオブジェクトを走査します, しかし、何かが間違っているようです。トラバースします オブジェクトは通常、キーと値を同時に出力することが期待されています。このようにコードを調整すると、
newObj[Symbol.iterator] = function* (){ let keys = Object.keys( this ) ; for(let i = 0, l = keys.length; i < l; i++){ yield { key: keys[i] , value: this[keys[i]] }; } } for(let v of newObj){ console.log( v ); } // 输出结果 // {key: "e", value: 5} // {key: "f", value: 6}
のようにオブジェクトが返されますが、これは非常に不快に思えます。構造化代入を試してみることはできますか? 。 。
for(let {key, value} of newObj){ console.log(key, value ); } // 输出结果 // e 5 // f 6
これは完璧ですね。 。 。
拡張知識: for-of ループと他のループの違い
ループ オブジェクト | ループを中断できるかどうか | 戻り値があるかどうか | |
---|---|---|---|
| forループ本体の length は | #戻り値なし # にすることもできます##forEach | |
配列、マップ、セットなど、文字列、通常のオブジェクトはループできない
| 不可能
戻り値なし |
do...while | |
Yes | 戻り値なしwhile | ||
##Yes 戻り値なし |
##map | 新しい配列メンバーを形成します。ループできるのは配列のみです。文字列と通常のオブジェクトはループできません。 set 、map | |
新しい配列を返します。元の配列には影響しません |
filter | 配列メンバーのフィルタリング。ループできるのは配列のみです。文字列と通常のオブジェクトはループできません。設定、マップ | |
新しい配列を返しますが、元の配列には影響しません |
for...in | 循環可能 | |
map,set。数値キー名をトラバースでき、プロトタイプ チェーン上のキーも含め、他の手動で追加されたキーもトラバースできます。
| Can
戻り値なし
| for...of | ループ可能な反復可能オブジェクト、ループ不可能な通常のオブジェクト (統合データ構造トラバーサル) |
戻り値なし |
[関連する推奨事項: | JavaScript ビデオ チュートリアル、 | Web フロントエンド
以上がes6 はオブジェクトをトラバースできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック

ES6 では、配列オブジェクトの reverse() メソッドを使用して、配列の反転を実現できます。このメソッドは、配列内の要素の順序を逆にして、最後の要素を最初に、最初の要素を最後に配置するために使用されます。構文「array」 。逆行する()"。 reverse() メソッドは元の配列を変更します。変更したくない場合は、拡張演算子 "..." とともに使用する必要があり、構文は "[...array].reverse() 」。

非同期はes7です。 async と await は ES7 に新しく追加されたもので、非同期操作のソリューションです。async/await は co モジュールとジェネレーター関数の糖衣構文と言え、より明確なセマンティクスで JS 非同期コードを解決します。名前が示すように、async は「非同期」を意味します。async は関数が非同期であることを宣言するために使用されます。async と await の間には厳密な規則があります。両方を互いに分離することはできず、await は async 関数内でのみ記述できます。

手順: 1. 構文 "newA=new Set(a); newB=new Set(b);" を使用して、2 つの配列をそれぞれセット型に変換します; 2. has() と filter() を使用して差分セットを検索します、構文 " new Set([...newA].filter(x =>!newB.has(x)))" では、差分セット要素がセット コレクションに含まれて返されます。 3. 配列を使用します。 from セットを配列に変換するタイプ、構文は「Array.from(collection)」です。

ブラウザの互換性のため。 ES6 は JS の新しい仕様として、多くの新しい構文と API を追加していますが、最新のブラウザーは ES6 の新機能を高度にサポートしていないため、ES6 コードを ES5 コードに変換する必要があります。 WeChat Web 開発者ツールでは、デフォルトで babel が使用され、開発者の ES6 構文コードを 3 つの端末すべてで適切にサポートされる ES5 コードに変換し、開発者がさまざまな環境によって引き起こされる開発上の問題を解決できるようにします。プロジェクト内でのみ設定して確認するだけです。 「ES6~ES5」オプション。

es5 では、for ステートメントと IndexOf() 関数を使用して配列の重複排除を実現できます。構文 "for(i=0;i<配列長;i++){a=newArr.indexOf(arr[i]);if( a== -1){...}}」。 es6 では、スプレッド演算子 Array.from() および Set を使用して重複を削除できます。まず配列を Set オブジェクトに変換して重複を削除してから、スプレッド演算子または Array.from() 関数を使用する必要があります。 Set オブジェクトを配列に変換してグループ化するだけです。

es6 では、一時的なデッド ゾーンは構文エラーであり、ブロックを閉じたスコープにする let および const コマンドを指します。コード ブロック内では、let/const コマンドを使用して変数が宣言される前に、変数は使用できず、変数が宣言される前は変数の「デッド ゾーン」に属します。これは構文上「一時デッド ゾーン」と呼ばれます。 ES6 では、一時的なデッド ゾーンや let ステートメントや const ステートメントでは変数のプロモーションが発生しないことを規定しています。これは主に実行時エラーを減らし、変数が宣言される前に使用されて予期しない動作が発生するのを防ぐためです。

いいえ、require は CommonJS 仕様のモジュール構文であり、es6 仕様のモジュール構文は import です。 require は実行時にロードされ、import はコンパイル時にロードされます。require はコード内のどこにでも記述できます。import はファイルの先頭にのみ記述でき、条件文や関数スコープでは使用できません。モジュール属性は導入されるだけです。 require を実行した場合、そのためパフォーマンスは比較的低くなりますが、インポート コンパイル中に導入されたモジュールのプロパティのパフォーマンスはわずかに高くなります。

地図は注文済みです。 ES6 のマップ タイプは、多くのキーと値のペアを格納する順序付きリストです。キー名と対応する値はすべてのデータ型をサポートします。キー名の等価性は、「Objext.is()」メソッドを呼び出すことによって決定されます。 , したがって、数字の 5 と文字列「5」は 2 つのタイプとして判断され、プログラム内で 2 つの独立したキーとして現れることができます。
