Object.keys(obj)與for..in的區(qū)別

Object.keys(obj)
參數(shù)obj:要返回其可枚舉屬性的對象
返回值:對象本身的可枚舉屬性組成的數(shù)組


for..in 語句
以任意順序遍歷一個對象的除symbol以外的可枚舉屬性


區(qū)別
object.keys(obj)只包括對象本身的屬性
for...in遍歷包括對象繼承自原型對象的屬性

實例

// 構(gòu)造函數(shù)
function test(name, age) {
    this.name = name;
    this.age = age;
}
// 實例化一個對象
const mytest = new test('zs', 18)
// 為構(gòu)造函數(shù)添加原型方法
test.prototype.action = () => {
    console.log('我是test原型上的方法')
}
const arr = ['a', 'b', 'c']
// 傳入夠著函數(shù),返回空數(shù)組
console.log(Object.keys(test))  // []
// 傳入實例對象,返回實例對象的所有屬性名
console.log(Object.keys(mytest))  // ['name','age']
// 傳入數(shù)組,返回索引
console.log(Object.keys(arr)) // ['0','1','2']
// for in 遍歷實例對象,原型中的屬性也會被遍歷
for (item in mytest) {
    console.log(item)   // name age action
}

js對象屬性中的可枚舉性?
在JavaScript中,對象的屬性分為可枚舉和不可枚舉之分,它們是由屬性的enumerable值決定的。
如果某個對象的屬性是不可枚舉的,那么以下三個方法無法作用到這個屬性:
for…in
Object.keys()
JSON.stringify

如何給對象定義一個不可枚舉的屬性
Object.defineProperty() 方法會直接在一個對象上定義一個新屬性,
或者修改一個對象的現(xiàn)有屬性,并返回此對象

//定義一個不可枚舉的屬性
Object.defineProperty(mytest,'sex',{
    value:'male',
    enumerable: false
   })
//通過對象.屬性的形式可以直接訪問到    
console.log(mytest.sex)
// 通過for...in、Object.keys(mytest)、JSON.stringify 無法作用到
for(item in mytest){
    console.log(item)  // name age action
}
console.log(Object.keys(mytest)) //['name','age']
console.log(JSON.stringify(mytest)) // {"name":"zs","age":18}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容