Object.keys(obj)与for..in的区别

Object.keys(obj)
参数obj:要返回其可枚举属性的对象
返回值:对象本身的可枚举属性组成的数组


for..in 语句
以任意顺序遍历一个对象的除symbol以外的可枚举属性


区别
object.keys(obj)只包括对象本身的属性
for...in遍历包括对象继承自原型对象的属性

实例

// 构造函数
function test(name, age) {
    this.name = name;
    this.age = age;
}
// 实例化一个对象
const mytest = new test('zs', 18)
// 为构造函数添加原型方法
test.prototype.action = () => {
    console.log('我是test原型上的方法')
}
const arr = ['a', 'b', 'c']
// 传入够着函数,返回空数组
console.log(Object.keys(test))  // []
// 传入实例对象,返回实例对象的所有属性名
console.log(Object.keys(mytest))  // ['name','age']
// 传入数组,返回索引
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() 方法会直接在一个对象上定义一个新属性,
或者修改一个对象的现有属性,并返回此对象

//定义一个不可枚举的属性
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}

你可能感兴趣的:(Object.keys(obj)与for..in的区别)