2015-12-24 15 views

答えて

28

Object.keys()は、オブジェクトのの列挙型のプロパティである文字列のarrayを返します。プロパティ。

Object.getOwnPropertyNames(target). 
        concat(Object.getOwnPropertySymbols(target)) 

Object.getOwnPropertyNames()方法が指定されたオブジェクト上に直接検出されたすべてのプロパティの配列(enumerable)を返し:

Reflect.ownKeys(obj)は、同等のものを返します。

Object.getOwnPropertySymbols()方法は、指定されたオブジェクト上に直接検出されたすべてのsymbolプロパティの配列を返します。

var testObject; 
Object.defineProperty(testObject, 'myMethod', { 
    value: function() { 
     alert("Non enumerable property"); 
    }, 
    enumerable: false 
}); 

//does not print myMethod since it is defined to be non-enumerable 
console.log(Object.keys(testObject)); 

//prints myMethod irrespective of it being enumerable or not. 
console.log(Reflect.ownKeys(testObject)); 

fiddleを実証する。

+0

これは用途がありますか? – m0meni

+0

'for..in'ステートメントで列挙可能ないくつかの' properties'を作成するかどうかによって異なります - http://stackoverflow.com/questions/14984533/what-are-the-benefits-of-making-プロパティ - 非列挙型 – BatScream

+2

キーとシンボルの重要な違いは、2つの異なるものとして列挙する必要がある場合とそうでない場合があります。 – CodingIntrigue

9

まず、例えば(ES6Fiddle):

ここ
// getFoo is property which isn't enumerable 
var my_obj = Object.create({}, { getFoo: { value: function() { return this.foo; } } }); 
my_obj.foo = 1; 

console.log(Object.keys(my_obj)); // console ['foo'] 
console.log(Reflect.ownKeys(my_obj)); // console ['getFoo', 'foo'] 

、ターゲットオブジェクト自身のプロパティキーの配列を返しReflect.ownKeys()。つまり、与えられたオブジェクトに直接見つかったすべてのプロパティ(列挙可能かどうか)の配列。すべてのsymbolの配列で連結されています。

Object.ownKeys()だけ列挙のプロパティを返します。

列挙特性はプロトタイプチェーンを介して継承されたプロパティを除いて、for...in loopによって列挙することができるものです。詳細はthe MDN descriptionを参照してください。

要約:両方の列挙および非列挙特性

Object.keys()戻る列挙特性に対し戻りますが(非列挙プロパティを返さないObject.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target))の当量が

Reflect.ownKeys()ありますこれはObject.getOwnPropertyNames()の特性です)。

4
  • Object.keysは、列挙可能な文字列キーのみを返します。 Reflect.ownKeysは、列挙可能性に関係なく、文字列キーとシンボルキーの両方を返します。どちらも独自のプロパティでのみ動作します。 Reflect.ownKeysTypeErrorをスローに対し引数は、オブジェクトではなくnull又はundefined(例えばObject.keys(1))でない場合
  • Object.keysは、空の配列を返します。
  • Reflect.ownKeysはES6で導入され、旧式のJavaScriptエンジンでサポートされていません。
+0

[Nope](http://stackoverflow.com/q/30076219/1048572)。実際には、* Reflect.ownKeysだけが確定的なキーの順序を与え、Object.keysは他のことをするかもしれません。 – Bergi

+0

@Bergi私はあなたがそれについて正しいと信じています。 7.3.21 EnumerableOwnNames(O)の点6を誤読していた。指摘してくれてありがとう。 –

関連する問題