【每日一题】Reflect.ownKeys 与 Object.keys 的区别

共 1869字,需浏览 4分钟

 ·

2021-08-28 13:02

人生苦短,总需要一点仪式感。比如学前端~

用法上

两个函数都是接受一个对象参数,并都是以数组形式返回对象属性的集合

而且参数都必须是对象,如果是其他乱麻七糟的类型,会报错

Reflect.ownKeys(targetObj)

Object.keys(targetObj)
使用示例

不同之处

关于对象属性是否可枚举

Reflect.ownKeys()可以得到对象自己的所有属性,包括不可枚举属性
Object.keys()只能得到对象的普通可枚举属性,拿不到不可枚举属性。

关于Symbol属性

Reflect.ownKeys()可以拿到对象的Symbol 的属性;
Object.keys()不行

关于数组的length属性

因为Reflect.ownKeys()可以得到对象的不可枚举属性这个特点,所以当目标对象是数组对象时,我们可以看到获取的结果会比Object.keys()多一个length属性

事实证明,数组的length也确实是“不可枚举的”:

关于对象的原型

俩人这点上谁也不比谁强,都拿不到原型链上的属性。

不过还好,这点需求上,可以用for...in来替代。

总结

分类表格

整理一个看上去更清晰的表格如下(感谢群友给的灵感)


方法分类普通属性不可枚举属性Symbol属性原型属性数组length
Reflect.ownKeys()
Object.keys()
for...in

数组length其实就是不可枚举属性那一列的延伸。

测试代码汇总:

Object.prototype.pr = "我是原型属性"// 原型上增加“pr”属性
let s = Symbol();
let obj = {
  [s]: "this is Symbol"// 增加一个Symbol属性“[s]”
  a"a"// 一个普通属性“a”
};
// 再定义一个不可枚举的属性“name”
Object.defineProperty(obj, "name", {
  value"sunny",
  configurabletrue,
  enumerablefalse// *
  writabletrue,
});

// 观察打印结果
console.log("Object.keys"Object.keys(obj)); // 只得到一个普通属性:["a"]
console.log("Reflect.ownKeys(obj)"Reflect.ownKeys(obj)); // 得到普通属性,以及symbol和不可枚举属性:["a", "name", Symbol()]

// 遗憾的是,二者都拿不到 原型上的属性“pr”。我们用for in来获取
for(let o in obj){
  console.log(o) // 分别打印:a、pr
}
打印结果
for in得到原型属性pr

看来for in也不能获取symbol属性和不可枚举属性🤦‍♀️……



END
愿你历尽千帆,归来仍是少年。


让我们一起携手同走前端路!


● 工作中常见页面布局的n种实现方法

● 三栏响应式布局(左右固宽中间自适应)的5种方法

● 两栏自适应布局的n种实现方法汇总

● 工作中常见的两栏布局案例及分析

● 垂直居中布局的一百种实现方式

● 常用九宫格布局的几大方法汇总

● 为什么操作DOM会影响WEB应用的性能?

● 移动端滚动穿透的6种解决方案

● Vue + TypeScript 踩坑总结

浏览 126
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报