填坑-十万个为什么?(3)

422 阅读2分钟

简介:很多概念不清或忘记,重新构建自己的知识体系。每天问自己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()方法返回一个布尔值,表示指定的属性是否可枚举