填坑-十万个为何?(3)

简介:不少概念不清或忘记,从新构建本身的知识体系。天天问本身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

遍历对象的每个可枚举属性,包括原型链上面的可枚举属性ui

for(var pro in kxy) {
    console.log("kxy." + pro + " = " + kxy[pro]);
  }
复制代码
Object.keys()方法

会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致,且只是遍历自身的可枚举属性,不能够遍历原型链上的可枚举属性this

console.log(Object.keys(kxy));
复制代码
Object.getOwnPropertyNames()

则是遍历自身全部属性(不管是否是可枚举的)spa

console.log(Object.getOwnPropertyNames(kxy));
复制代码
④经过JSON.stringify()方法

转换,只能取到可枚举属性prototype

console.log(JSON.stringify(kxy));
复制代码

①-④打印结果 3d

Object.entries()方法 补充内容2018年12月22日20:32:39

返回一个给定对象自身可枚举属性的键值对数组,其排列与使用 for...in 循环遍历该对象时返回的顺序一致(区别在于 for-in 循环也枚举原型链中的属性)。code

console.log(Object.entries(kxy));
复制代码

⑥静态方法Reflect.ownKeys() 补充内容2019年1月14日09:11:47

返回一个由目标对象自身的属性键组成的数组。则是遍历自身全部属性(不管是否是可枚举的)
返回值等同于Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target))cdn

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方法

例子blog

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()方法返回一个布尔值,表示指定的属性是否可枚举

相关文章
相关标签/搜索