對象的屬性有自身屬性和原型屬性之分,自身屬性是對象自己的屬性,原型屬性是存在於原型鏈上的屬性。
可以用Object.prototype.hasOwnProperty()判斷是自身屬性還是原型屬性。(in操作符只可以判斷對象是否有某個屬性,不能判斷是自身的,還是原型上的)
對象屬性也有可枚舉和不可枚舉之分,可枚舉屬性的屬性描述符enumerable為true,不可枚舉屬性的為false。
原生對象的大多數屬性都是不可枚舉的,比如數組和字符串的length,對象原型上的一些方法和屬性,比如toString、constructor、hasOwnProperty等等
下面看下都有哪些方式可以獲取對象的屬性
Object.keys()
返回自身的可枚舉屬性組成的數組 (不包含symbol)
Object.getOwnPropertyNames()
返回所有的自身屬性 組成的數組 (不包含symbol)
Object.getOwnPropertySymbols()
返回自身所有的Symbol屬性組成的數組
for...in
遍歷對象的所有可枚舉屬性
區別
可枚舉 | 可枚舉和不可枚舉 | |
---|---|---|
僅自身屬性 | Object.keys | Object.getOwnPropertyNames |
自身和原型屬性 | for...in |
沒有原生的方法可以獲取對象上所有的屬性,包含自身和原型、可枚舉和不可枚舉,需要自己實現,示例如下:
function getAllkeys (obj) {
const keys = []
let temp = obj
while (temp) {
keys.push.apply(keys, Object.getOwnPropertyNames(temp))
keys.push.apply(keys, Object.getOwnPropertySymbols(temp))
temp = Object.getPrototypeOf(temp)
}
return keys
}
for...of 和 for...in的區別
for let i in obj 是以任意順序遍歷對象的可枚舉屬性,i是key
for let value of iterable 是按順序迭代一個可迭代對象,i是值
iterable可迭代對象包括:Array、Map、Set、String、TypedArray、arguments