Before we look at our options, pay attention to four key properties of JavaScript properties:
- Objects can have their own properties and properties that they inherit from their prototype.
- Properties may or may not be listed.
- , , (, ES2015/ES6),
Symbol s. - , , 1. , , , . ( , JavaScript , ), , . ,
a = ['x', 'y', 'z'] , "0", "1" "2". a[0] , 0 . ( , , JavaScript .)
( ).
:
- A
for-in loop (spec | MDN), hasOwnProperty , "" . ( Symbol s.) . Object.keys (spec | MDN) (ES5 +), , . ( Symbol s.)Object.getOwnPropertyNames (spec | MDN) (ES5 +), , , . ( Symbol s.)Reflect.enumerate (spec | MDN) (ES2015 +), , , . ( Symbol s.) ES2016.Object.getOwnPropertySymbols (spec | MDN) (ES2015 +), Symbol s, , . ( , .)Reflect.ownKeys (spec | MDN) (ES2015 +), , (Symbol string), .
, , , Object.getOwnPropertySymbols Reflect.ownKeys Symbol s.
( ES2015) for-in Object.keys. ES2015 , [[OwnPropertyKeys]] ( ) [[Enumerate]]. ( ES2015 - [ ] , , JavaScript- .)
. -, :
var proto = {
one: 1
}
var obj = Object.create(proto);
obj.two = 2;
obj.three = 3;
Object.defineProperty(obj, "four", {
value: 4,
configurable: true,
writable: true
});
ES5
(Object.create, , [ ], / JavaScript, IE8. Object.defineProperty ES5, /.)
, , Symbol.
, (* ):
+βββββββββββββββββ+
Object.prototypeββββββββββββββββββββββββββββββββ+ββ>| toString* |ββ>(...a function...)
| | valueOf* |ββ>(...a function...)
| | hasOwnProperty* |ββ>(...a function...)
| | ... |
| +βββββββββββββββββ+
|
+βββββββββββββββ+ |
protoββββββββββββββββββββ+ββ>| [[Prototype]] |ββ+
| | one: 1 |
| +βββββββββββββββ+
|
+βββββββββββββββ+ |
objββ>| [[Prototype]] |ββ+
| two: 2 |
| three: 3 |
| four*: 4 |
+βββββββββββββββ+
:
for-in
for-in ( , ), ( Symbol s).
for (var name in obj) {
console.log(name + " = " + obj[name]);
}
var proto = {
one: 1
}
var obj = Object.create(proto);
obj.two = 2;
obj.three = 3;
Object.defineProperty(obj, "four", {
value: 4,
configurable: true,
writable: true
});
for (var name in obj) {
console.log(name + " = " + obj[name]);
}
Hide resulttwo = 2
three = 3
one = 1
... . , , , ES2015.
for-in hasOwnProperty
, , hasOwnProperty:
for (var name in obj) {
if (obj.hasOwnProperty(name)) {
console.log(name + " = " + obj[name]);
}
}
var proto = {
one: 1
}
var obj = Object.create(proto);
obj.two = 2;
obj.three = 3;
Object.defineProperty(obj, "four", {
value: 4,
configurable: true,
writable: true
});
for (var name in obj) {
if (obj.hasOwnProperty(name)) {
console.log(name + " = " + obj[name]);
}
}
Hide resulttwo = 2
three = 3
one, .
hasOwnProperty - , , :
obj.hasOwnProperty = function() {
return true;
};
... . , , Object.prototype:
var hasOwn = Object.prototype.hasOwnProperty;
for (var name in obj) {
if (hasOwn.call(obj, name)) {
console.log(name + " = " + obj[name]);
}
}
, - Object.prototype.hasOwnProperty, , .
Object.keys (ES5 +, /)
Object.keys , . , , , , Symbol s.
var propNames = Object.keys(obj);
, forEach:
propNames.forEach(function(name) {
console.log(name + " = " + obj[name]);
});
var proto = {
one: 1
}
var obj = Object.create(proto);
obj.two = 2;
obj.three = 3;
Object.defineProperty(obj, "four", {
value: 4,
configurable: true,
writable: true
});
var propNames = Object.keys(obj);
propNames.forEach(function(name) {
console.log(name + " = " + obj[name]);
});
Hide result, :
two = 2
three = 3
, ES2015.
Object.getOwnPropertyNames (ES5 +)
Object.getOwnPropertyNames , , . Symbol s.
var propNames = Object.getOwnPropertyNames(obj);
propNames.forEach(function(name) {
console.log(name + " = " + obj[name]);
});
var proto = {
one: 1
}
var obj = Object.create(proto);
obj.two = 2;
obj.three = 3;
Object.defineProperty(obj, "four", {
value: 4,
configurable: true,
writable: true
});
var propNames = Object.getOwnPropertyNames(obj);
propNames.forEach(function(name) {
console.log(name + " = " + obj[name]);
});
Hide result, :
two = 2
three = 3
four = 4
[[OwnPropertyKeys]] , , :
, two, three, four, , . , , :
var obj2 = {};
obj2.four = 4;
obj2[0] = "zero";
obj2.two = 2;
obj2.three = 3;
Object.getOwnPropertyNames(obj2).forEach(function(name) {
console.log(name + " = " + obj2[name]);
});
var obj2 = {};
obj2.four = 4;
obj2[0] = "zero";
obj2.two = 2;
obj2.three = 3;
Object.getOwnPropertyNames(obj2).forEach(function(name) {
console.log(name + " = " + obj2[name]);
});
Hide result:
0 = zero
four = 4
two = 2
three = 3
0 , , . four, , two, three.
Reflect.enumerate (ES2015) ES2016
Reflect.enumerate ES2016.
< > Reflect.enumerate ES2015. , , , , Symbol . "" ( , [[OwnPropertyKeys]], ( "" ).
for-of :
for (let name of Reflect.enumerate(obj)) {
console.log(name + " = " + obj[name]);
}
:
two = 2
three = 3
one = 1
one , , "own" .
. , ES2015 , JavaScript Reflect.
Object.getOwnPropertySymbols (ES2015 +)
Object.getOwnPropertySymbols Symbol s, , . ( , ). , , Symbol - . , :
var obj3 = {};
obj3[Symbol("x")] = "ecks";
obj3[1] = "one";
obj3[Symbol("y")] = "why";
obj3.z = "zee";
Object.getOwnPropertySymbols(obj3).forEach(function(symbol) {
console.log(symbol.toString() + " = " + obj3[symbol]);
});
var obj3 = {};
obj3[Symbol("x")] = "ecks";
obj3[1] = "one";
obj3[Symbol("y")] = "why";
obj3.z = "zee";
Object.getOwnPropertySymbols(obj3).forEach(function(symbol) {
console.log(symbol.toString() + " = " + obj3[symbol]);
});
Hide result:
Symbol(x) = ecks
Symbol(y) = why
z , , Symbol. Symbol(x) , .
Symbols, , , , , toString Symbol(the name here) . , toString (thesymbol.toString()) String(theSymbol); + .
Reflect.ownKeys (ES2015 +)
Reflect.ownKeys , (Symbol string), . :
var obj3 = {};
obj3[Symbol("x")] = "ecks";
obj3[1] = "one"
obj3[Symbol("y")] = "why";
obj3.z = "zee";
Reflect.ownKeys(obj3).forEach(function(key) {
console.log(key.toString() + " = " + obj3[key]);
});
var obj3 = {};
obj3[Symbol("x")] = "ecks";
obj3[1] = "one"
obj3[Symbol("y")] = "why";
obj3.z = "zee";
Reflect.ownKeys(obj3).forEach(function(key) {
console.log(key.toString() + " = " + obj3[key]);
});
Hide result:
1 = one
z = zee
Symbol(x) = ecks
Symbol(y) = why
, [[OwnPropertyKeys]]: 1 , , . z , string. Symbol -named, , .