JavaScriptオブジェクトの走査方法
一般的なオブジェクト走査方法
for...inループ
Object.keys()
Object.getOwnPropertyNames()
Object.getOwnPropertySymbols()
Reflect.ownKeys()
オブジェクトのプロパティ分類とSymbolプロパティ
1. オブジェクトのプロパティ分類
- プロトタイププロパティ
- オブジェクト自身の列挙可能プロパティ
- オブジェクト自身の列挙不可能プロパティ
- Symbolプロパティ
// 注意: Object.createは指定されたオブジェクトをプロトタイプとして新しいオブジェクトを作成します
const sample = Object.create({
prototypeProp: 'prototype' // プロトタイププロパティ
});
sample.ownProp = 'own'; // オブジェクト自身の列挙可能プロパティ
Object.defineProperty(sample, 'hidden', { // オブジェクト自身の列挙不可能プロパティ
enumerable: false,
value: 'hiddenValue'
});
sample[Symbol('unique')] = 'uniqueValue'; // Symbolプロパティ
2. Symbolプロパティに関する補足
1. const sym = Symbol('a'), Symbolインスタンスはnewで作成できません
2. 同じ記述を持つSymbolインスタンスは等しくありません Symbol('b') !== Symbol('b')
3. 同じ記述を持つ等しいSymbolを取得したい場合は:Symbol.for('c') === Symbol.for('c')
各走査方法の詳細
1. for…inループ
- この方法は、オブジェクト自身の列挙可能プロパティとプロトタイプチェーン上の列挙可能プロパティを取得できますが、Symbolプロパティは含みません
// 例1
for(let key in sample) {
console.log(key)
};
// 結果: prototypeProp ownProp
// 例2 プロトタイプ上のプロパティを除外する場合:
for(let key in sample) {
if (sample.hasOwnProperty(key)) {
console.log(key)
}
};
// 結果: ownProp
// 例3 for..inの出力順序:
// 0以上の整数の場合、サイズ順にソートされます
// 小数や負数は文字列として扱われます
// 文字列タイプの場合、辞書順に出力されます
// Symbolプロパティは除外されません
const testObj = {
5: 'five',
a: 'alpha',
1: 'one',
c: 'char',
'-1': 'negative',
'3': 'three',
b: 'beta'
}
for(let key in testObj) {
console.log(key);
}
// 結果: 1 3 5 a c -1 b
2. Object.keys()メソッド
- このメソッドはオブジェクト自身の列挙可能プロパティを取得します
- プロトタイプ上の列挙可能プロパティやSymbolプロパティは含みません
- ES5で追加
Object.keys(sample).forEach(key => console.log(key)) // 出力: ownProp
3. Object.getOwnPropertyNames()メソッド
- このメソッドはオブジェクト自身のすべてのプロパティ(列挙不可能なプロパティを含む)を取得します
- ただし、プロトタイププロパティやSymbolプロパティは含みません
- ES5で追加
Object.getOwnPropertyNames(sample).forEach(i => console.log(i))// 出力: ownProp hidden
// 補足: プロパティが列挙可能かどうかを判定する方法:
//方法1:
Object.getOwnPropertyDescriptor(sample, 'hidden')
//方法二:
Object.prototype.propertyIsEnumerable.call(sample, ['hidden'])
4. Object.getOwnPropertySymbols()メソッド
- このメソッドはオブジェクト自身のすべてのSymbolプロパティを取得します
- プロトタイプ上のSymbolプロパティは含みません
- ES6で追加
Object.getOwnPropertySymbols(sample).forEach(i => console.log(i));// 出力: Symbol(unique)
5. Reflect.ownKeys()メソッド
- このメソッドはオブジェクト自身のすべてのプロパティ(列挙不可能なプロパティとSymbolプロパティを含む)を取得します
- ES6で追加
Reflect.ownKeys(sample).forEach(i => console.log(i)); // 出力: ownProp hidden Symbol(unique)