JavaScriptオブジェクトが巡回しています.

3256 ワード

ことばを引く
対象を遍歴するのは普通の仕事の中でよくある操作で、ほとんど日常の操作ですが、対象を遍歴するのは本当に簡単なことですか?明らかに違います.
常用の方式
for…infor (variable in object) {...}これはよくある使い方です.誰でも簡単に書けると信じています.ここで必要なのは、この遍歴の定義です.
for...in文は、オブジェクトが所有する継承可能、列挙可能、非Symbolの属性を任意の順序で巡る.各属性については、ステートメントが実行されます.
一つ一つの語をほじくりなさい.
相手にはおのずとある
もしkeyがオブジェクトに固有のものであれば、必ずobj.hasOwnPropertyの戻り値で判断することができます.
受け継ぐ
これもよく分かります.例えば次の例です.
var parent = {a: 1};

function child() {
  this.b = 'b';
}

child.prototype = parent;

var obj = new child();
この時、Objのプロトタイプチェーンはparentを継承していますので、実はObjにはa属性があります.つまり、for inはオブジェクトのプロトタイプチェーン上の属性を巡回します.
列挙できる
列挙可能な詳細はこのリンクを見てもいいです.まず対象の属性は2種類に分けられています.データの属性はa[b]=1のようです.これはデータの属性です.もう一つはアクセス器の属性です.つまり私達が使っているgetterです.この二つの属性はいずれも一つの特性を持っています.このブール値はこの属性が列挙できるかどうかを表しています.オブジェクトの属性が列挙不可能に設定されている場合、for inは巡回できません.エニュメレーション性はpropertyIs Eumerableで判断できます.
Symbolではない
Symbolは何ですか?ここで展開しません.不慣れな提案をしています.SS 6 smbol smborgolはある対象に私有属性を作るために使用できます.属性値がsmbolタイプであればfor inも遍歴できません.
結び目
このように、オブジェクトの属性はどのようなものなのかを明確に知ることができます.配列は私達が自然にfor inを使うことができますが、配列も対象と考えられていますか?なぜ私達がfor inを使う時は配列の長さやlengthを属性として遍歴しませんか?
Object.keys()
Object.keys()メソッドは、与えられたオブジェクトの自身のエニュメレート・属性からなる行列を返します.配列内の属性名の配列順と、for...inを使ってオブジェクトを巡回したときに返される順序は一致します.
注意点こことfor inは大きな違いがあります.これは対象自体が列挙可能な属性からなる行列です.継承は含まれていません.
var parent = {a: 1};

function child() {
  this.b = 'b';
}

child.prototype = parent;

var obj = new child();
Object.keys(obj);  //['b']
Object.getOwn PropertyNames(obj)とObject.getOwn PropertySymbors(Obj)
getOwnPropertyNames方法は、指定されたオブジェクトのすべての属性の属性名(エニュメレート・属性を含むが、名前の属性としてSymbol値を含まない)からなる行列を返します.getOwnPropertySymbool方法は、与えられたオブジェクト自体のSymbol属性のすべての配列を返します.キーワード、全部、自分の.この2つの方法は、エニュメレート・属性の有無によって制限されず、自身だけに戻るので、Object.getOwnPropertyNamesの戻り値は、Object.keysの戻り値を含むに違いない.
Reflect.ownKeys(obj)
Reflect.ownKeysメソッドは、ターゲットオブジェクト自身の属性キーからなる配列を返します.その戻り値はObject.getOwn PropertyNames.concat(Object.getOwn PropertySymbors)に等しい.
for…of.
次はもう一つの巡回案について話します.for ofはfor inとは違って、for ofは、反復可能なオブジェクト(Aray、Map、Set、String、TypedAray、argmentsオブジェクトなどを含む)で反復ループを作成し、ユーザー定義の反復フックを呼び出し、各属性の値についてステートメントを実行します.次はキーワードを絞り込む段階です.
イテレーションオブジェクト
反復可能なオブジェクトは何ですか?反復可能なプロトコルがあるオブジェクトに従って反復可能なオブジェクトになります.使用者というのはオブジェクトがある場合、彼は反復可能なオブジェクトです.Symbol.iteratorはs 6で内蔵のSymbol値を提供します.iteratorは簡単にいうと、next関数があります.この関数が実行する戻り値は必ずオブジェクトです.オブジェクトは二つの属性doneで反復が終了するかどうかをマークしています.valueは今回の反復の結果値をマークしています.
forを使うにはどうすればいいですか?オブジェクトを巡回します.
つまり、あなたの遍歴対象にSymbol.iteratorを追加すればいいです.
拡張演算子
上記以外にも遍歴したシーンを追加したいです.オブジェクトの拡張演算子は、オブジェクトの拡張演算子はどのような属性が与えられますか?自身の、列挙することができます.二つの例が見られます.
var obj = {}
Object.defineProperty(obj, 'key', {
    enumerable: false,
      configurable: true,
      writable: true,
  value: "a"
});
b = {...obj};
console.log(b); //{}
エニュメレート・プロパティーは、デフォーカシング値においては与えられないものと見られます.
var parent = {a: 1};

function child() {
  this.b = 'b';
}

child.prototype = parent;

var obj = new child();
var b = {...obj};  
console.log(b);//{b: 'b'}
相続の属性は、デフォーカシングにおいては割り当てられないことが分かります.
締め括りをつける
オブジェクトの遍歴方法は多いですが、具体的なオブジェクト属性の特徴とアプリケーションシーン、互換性によって最適なエルゴード方式を選択します.