填坑-十萬個爲何?(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()方法返回一個布爾值,表示指定的屬性是否可枚舉

相關文章
相關標籤/搜索