JS获取对象key的方法for in,Object.keys,Object.getOwnPropertyNames,Reflect.ownKeys比较

目录

一、前情提要

1.一个对象增加属性或方法,一般这样做

2.使用Object.defineproperty增加属性或方法

二、获取对象的key的方法比较

1.for in

2.Object.keys

3.Object.getOwnPropertyNames

4.Reflect.ownKeys

5.Object.getOwnPropertySymbols

总结


一、前情提要

先来看一下Object.defineproperty。

Object.defineproperty 就是直接在一个对象上定义一个新属性,或者修改一个已经存在的属性。

1.一个对象增加属性或方法,一般这样做

let params = {};
//新增name属性
params.name="CSDN";
//新增userAction方法
params.userAction=function() {
    console.log("这是新添加的方法");
};
console.log(parmas);
//结果打印{name: 'CSDN', userAction: ƒ}

2.使用Object.defineproperty增加属性或方法

Object.defineproperty(obj, prop, desc  )   

 参数1:obj     需要定义属性的当前对象

 参数2:prop    当前需要定义的属性名

 参数3:desc    描述符 一般是一个对象

let params = {};
Object.defineProperty(params,'name',{
    value:'CSDN'
});
Object.defineProperty(params,'userAction',{
    value:function() {
        console.log("这是新添加的方法");
    }
});
//其它属性如下,此处不做分析
//writable:是否可重写
//value:当前值
//get:读取时内部调用的函数
//set:写入时内部调用的函数
//enumerable:是否可枚举
//configurable:是否可再次修改配置项

二、获取对象的key的方法比较

我们定义两个对象parent和children。

parent中定义了:

parentName:可枚举属性

parentAge:不可枚举属性

parentSex属性

parent的symbol属性

//定义parent对象
let parent = {};
Object.defineProperty(parent,'parentName',{
    value:'这是parentName',
    enumerable:true,//可枚举
});
Object.defineProperty(parent,'parentAge',{
    value:'这是parentAge',
    enumerable:false,//不可枚举
});
Object.defineProperty(parent,'parentSex',{
    value:Symbol("男性"),
    enumerable:true,
});
let parentIdCard = Symbol('身份证号');
parent[parentIdCard] = parentIdCard;
console.log(parent);


parent打印结果:

childeren中定义了:

childrenName:可枚举属性

childrenAge:不可枚举属性

childrenSex属性

children的symbol属性

//定义children对象
let children = {};
Object.defineProperty(children,'childrenName',{
    value:'这是childrenName',
    enumerable:true,//可枚举
});
Object.defineProperty(children,'childrenName',{
    value:'这是childrenName',
    enumerable:false,//不可枚举
});
Object.defineProperty(children,'childrenSex',{
    value:Symbol("男性"),
    enumerable:true,
});
let childrenIdCard = Symbol('身份证号');
children[childrenIdCard] = childrenIdCard;
console.log(children);

children.__proto__ = parent;

children打印结果:

 children继承parent;

 1.for in

for(let p in children) {

        console.log(p);

}

结果如下:

 可见for in 遍历了自身和继承的所有可枚举属性;不包含不可枚举和Symbol属性

2.Object.keys

console.log(Object.keys(children));

结果如下:

可见Object.keys执行后会返回一个数组,而且只遍历了自身可枚举的属性;不包括不可枚举和Symbol属性

3.Object.getOwnPropertyNames

console.log(Object.getOwnPropertyNames(children));

结果如下:

 可见Object.getOwnPropertyNames执行后返回一个数组,遍历了自身的可枚举属性和不可枚举属性;不包含Symbol属性

4.Reflect.ownKeys

console.log(Reflect.ownKeys(children));

 可见Reflect.ownKeys执行后返回一个数组,遍历了自身所有属性,包括可枚举、不可枚举、Symbol属性

5.Object.getOwnPropertySymbols

console.log(Object.getOwnPropertySymbols(children));

结果如下:

 

可见 Object.getOwnPropertySymbols执行后返回一个数组,遍历了对象自身的所有Symbol属性


总结

for in:遍历自身的和继承的全部可枚举属性。不包括不可枚举属性和Symbol属性

Object.keys():返回一个数组;获取自身(不含继承)可枚举属性。不包括不可枚举属性、Symbol属性

Object.getOwnPropertyNames:返回一个数组;获取自身全部(不含继承)属性名称,包括不可枚举属性,不包括Symbol属性

Object.getOwnPropertySymbols:返回一个数组,遍历了对象自身的所有Symbol属性

Reflect.ownKeys:返回一个数组;获取自身(不含继承)全部属性名称,包括不可枚举属性、Symbol。其实就是Object.getOwnPropertyNames与Object.getOwnPropertySymbols之和

只有for in 包含继承的可枚举属性;

只有Object.getOwnPropertySymbols和Reflect.ownKeys可以包含Symbol属性;

只有Object.getOwnPropertyNames和Reflect.ownKeys包含不可枚举属性;

猜你喜欢

转载自blog.csdn.net/zuhaonuli/article/details/128645197