Ways to iterate through objects
标签:
JavaScript
Relevant basic concepts
Property accessors
let obj = { a: 'b'};// dot notationconsole.log(obj.a); // 'b'// bracket notationconsole.log(obj['a']); // 'b'// through prototype chainconsole.log(obj.toString, obj.toString === Object.prototype.toString); // ƒ toString() { [native code] } trueCheck whether an property exists in object
in operator: returns true if the specified property is in the specified object or its prototype chain.
hasOwnProperty: returns a boolean indicating whether the object has the specified property as its own property (as opposed to inheriting it).
let obj = { a: 'b'};console.log('a' in obj); //trueconsole.log('toString' in obj); //trueconsole.log(obj.hasOwnProperty('a')); //trueconsole.log(obj.hasOwnProperty('toString')); //falseObject.defineProperty && Object.defineProperties - defines new or modifies existing properties directly on an object, returning the object.
let obj = { a: "b"};Object.defineProperties(obj, { c: { value: 'd'
}, e: { value: 'f'
}
});console.log(obj); // {a: "b", c: "d", e: "f"}getter and setter
We can use getters and setters to generate computed property. E.g.
let people = { firstName: 'michael', lastName: 'zheng',
get fullName() { return `${this.firstName} ${this.lastName}`
},
set fullName(val) {
[this.firstName, this.lastName] = val.split(' ');
}
}console.log(people.firstName, people.lastName, people.fullName);//"michael", "zheng", "michael zheng"people.fullName = 'hello world';console.log(people.firstName, people.lastName, people.fullName);//"hello", "world", "hello world"There are three ways to iterate through objects
let student = { name: "michael"};Object.defineProperties(student, { age: { enumerable: false, value: 18
}, grade: { value: 6, enumerable: true
}, sex: { value: "male", enumerable: false
}
});Object.prototype.x = "inherited";In the sample above, we create an object student. student has following properties:
name: self enumerable property
age: self non-enumerable property
grade: self enumerable property
sex: self non-enumerable property
as well as a custom property from prototype chain:
x: enumerable
for...in iterates over enumerable properties of an object, including prototype chain.
for (let prop in student) { console.log(prop); //'name', 'grade', 'x'}for (let prop in student) { // self properties only
if (student.hasOwnProperty(prop)) { console.log(prop); // 'name', 'grade'
}
}Object.keys returns an array of a given object's property names, only iterate through self enumerable properties.(i.e. not including prototype chain)
console.log(Object.keys(student)); // [‘name’, 'grade']//check whether is plain object:Object.keys(student).length === 0; //falseObject.keys({}).length === 0; //trueObject.getOwnPropertyNames returns an array of all self properties (including non-enumerable properties) found directly upon a given object.
// will not iterate through prototype chainconsole.log(Object.getOwnPropertyNames(student)); // [‘name’, ‘age’, 'grade', 'sex']
Summarize
| methods | through prototype chain | enumerable only |
|---|---|---|
| for...in | Y | Y |
| Object.keys | N | Y |
| Object.getOwnPropertyNames | N | N |
作者:不吃猫的鱼_zjh
链接:https://www.jianshu.com/p/cc716f9797fa
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦