简介:很多概念不清或忘记,重新构建自己的知识体系。每天问自己1~多个问题。我是菜鸟 成为大神之路!
1. JavaScript获取一个对象的所有属性(自身属性和继承属性)?
function Person() {
this.name = "KXY";
}
Person.prototype = {
constructor: Person,
job: "student"
};
var kxy = new Person();
Object.defineProperty(kxy, "achievement", {//概念在第二问
value: "The first prize",
enumerable: true
});
Object.defineProperty(kxy, "sex", {
value: "female",
enumerable: false
});
① for...in
遍历对象的每一个可枚举属性,包括原型链上面的可枚举属性
for(var pro in kxy) {
console.log("kxy." + pro + " = " + kxy[pro]);
}
②Object.keys()
方法
会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 for...in
循环遍历该对象时返回的顺序一致,且只是遍历自身的可枚举属性,不可以遍历原型链上的可枚举属性
console.log(Object.keys(kxy));
③Object.getOwnPropertyNames()
则是遍历自身所有属性(不论是否是可枚举的)
console.log(Object.getOwnPropertyNames(kxy));
④通过JSON.stringify()
方法
转换,只能取到可枚举属性
console.log(JSON.stringify(kxy));
①-④打印结果
⑤Object.entries()
方法 补充内容2018年12月22日20:32:39
返回一个给定对象自身可枚举属性的键值对数组,其排列与使用 for...in
循环遍历该对象时返回的顺序一致(区别在于 for-in
循环也枚举原型链中的属性)。
console.log(Object.entries(kxy));
⑥静态方法Reflect.ownKeys()
补充内容2019年1月14日09:11:47
返回一个由目标对象自身的属性键组成的数组。则是遍历自身所有属性(不论是否是可枚举的)
返回值等同于Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target))
。
var sym = Symbol.for("comet");
var sym2 = Symbol.for("meteor");
var obj = {[sym]: 0, "str": 0, "773": 0, "0": 0,
[sym2]: 0, "-1": 0, "8": 0, "second str": 0};
Reflect.ownKeys(obj);
// [ "0", "8", "773", "str", "-1", "second str", Symbol(comet), Symbol(meteor) ]
2. 什么是不可枚举属性?
属性的enumerable值决定,如果一个属性的enumerable为false,下面三个操作不会取到该属性。
for..in循环
Object.keys方法
JSON.stringify方法
例子
function Person() {
this.name = "KXY";
}
Person.prototype = {
constructor: Person,
job: "student"
};
var kxy = new Person();
Object.defineProperty(kxy, "sex", {
value: "female",
enumerable: false
});
其中用defineProperty
为对象定义了一个名为'sex'
的不可枚举属性
3. 判断对象中是否存在某属性?
function Person() {
this.name = "KXY";
}
Person.prototype = {
constructor: Person,
job: "student"
};
var kxy = new Person();
① hasOwnProperty()
方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性
kxy.hasOwnProperty('name'); // 返回 true
kxy.hasOwnProperty('job'); // 返回 false
kxy.hasOwnProperty('constructor'); // 返回 false
② in
运算符判断无论是自身属性,还是原形链上的继承属性,都能检测到返回true >>link
'name' in kxy;// 返回 true
'job' in kxy;// 返回 true
'constructor' in kxy;// 返回 true
4. 判断属性是否可枚举?
propertyIsEnumerable()
方法返回一个布尔值,表示指定的属性是否可枚举