2017-01-12 8 views
0

ImはOOPでの作業やオブジェクトの値を反復処理する方法を見て値、例として、このコード:オブジェクトを繰り返すこと

var numbers = { 
    one: "number one", 
    two: "number two", 
    three: "number three", 
    four: "number four" 
}; 

し、その値を反復処理するために、私はこれを得た:

少し深く見て、研究しながら
for(var index in numbers){ 
    var x = index; 
    console.log(numbers[x]);  
} 

は、私はまた、このようなオブジェクトの値を反復処理することができますmozillla.orgに見た:

console.log(Object.values(numbers)); 

私の質問は、もう一方には何か利点はありますか?毎日のプログラミングでは、1つはもう一方を使いますか?

+0

さまざまな方法でdこれは単に好みと可読性に過ぎない。たとえば、 'Object.keys()'を反復して、そのように値を取得することができます –

+0

コードを動作させるブラウザの種類によって異なります:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/values#Browser_compatibility。それはまた、あなたが望むものに依存します。プロパティを反復処理する必要がある場合は、ループを使用します。値の配列が必要な場合は、 'Object.values'(polyfillを使用)を使用します。 –

+0

これを「反復」と呼んでいますか? http://www.dictionary.com/browse/iterate – leaf

答えて

0

for...inループは、継承されたプロパティを含むオブジェクトの列挙可能なプロパティを反復します。さらに、それはES5であり、現在のすべてのブラウザでサポートされています。

var obj1 = { a: 1, b: 2 }; 
 
var obj2 = Object.create(obj1); 
 
obj2.c = 3; 
 

 
for (var key in obj2) { 
 
    console.log(obj2[key]); 
 
}

Object#valuesオブジェクト独自のプロパティ(継承しないもの)の配列を作成し、それらを反復しません。さらに、ECMAScript 2017ドラフトなので、IEや古いブラウザではサポートが不足しています。

var obj1 = { a: 1, b: 2 }; 
 
var obj2 = Object.create(obj1); 
 
obj2.c = 3; 
 

 
console.log(Object.values(obj2));

あなたがオブジェクト自身のプロパティを反復処理したい、と古いブラウザをサポートしている場合、あなたは、配列反復法でObject#keysを使用することができ、そのようなArray#forEachなど:

var obj1 = { a: 1, b: 2 }; 
 
var obj2 = Object.create(obj1); 
 
obj2.c = 3; 
 

 
var result = Object.keys(obj2).forEach(function(key) { 
 
    console.log(obj2[key]); 
 
});

+0

返信いただきありがとうございます。「継承されたプロパティ」とは何を意味していますか?私はあなたがリンクを持っていれば、足の仕事をする気にしないでください – somdow

+1

継承されたプロパティは、オブジェクトに直接割り当てられていないが、プロトタイプチェーンの親から来るプロパティです。私のコード例では、 'obj1'の中で' obj2'を作成し、 'obj1'から来るプロパティは' obj2'によって継承されます。詳細は、[こちら](https://developer.mozilla.org/en/docs/Web/JavaScript/Inheritance_and_theprototype_chain)を参照してください。 –

+0

keys + foreach ...私は、コストがゼロであるような関数を呼び出す傾向を知っているのが嫌いです。 – leaf

関連する問題