如何解决for in 循环无法遍历symbol key的问题

简介: 如何解决for in 循环无法遍历symbol key的问题

先说for in循环对象,hasOwnProperty()的作用

var obj = {
    name:"echolun",
    age:"24",
    sex:"male"
},
objName=[], //用来装对象属性名
objVal=[];  //用来装对象属性值
for(var i in obj){
    objName.push(i);
    objVal.push(obj[i]);
}
console.log(objName,objVal);

image.png

需要注意的是,for in循环对象会访问原型链上所有对象属性,看下面。

var obj = {
    name:"echolun",
    age:"24",
    sex:"male"
},
objName=[], //用来装对象属性名
objVal=[];  //用来装对象属性值
Object.prototype.game="lastgame";
for(var i in obj){
    objName.push(i);
    objVal.push(obj[i]);
}
console.log(objName,objVal);
}

这里同样是循环对象obj,但是需要注意的是,原型链上我们额外添加的对象game也被循环出来。

image.png

那么我们只想循环对应的对象该怎么做呢,这里引入hasOwnProperty()方法,hasOwnProperty()函数用于指示一个**对象自身(不包括原型链)**是否具有指定名称的属性。如果有,返回true,否则返回false。


说简单点,它能帮你指向你当前循环的对象,而过滤掉原型链上其它对象,因为在工作中我们很难保证其他人是否会修改原型链,这样做会更为保险,那么修改代码:

var obj = {
    name:"echolun",
    age:"24",
    sex:"male"
},
objName=[], //用来装对象属性名
objVal=[];  //用来装对象属性值
Object.prototype.game="lastgame";
for(var i in obj){
    if(obj.hasOwnProperty(i)) {
        objName.push(i);
        objVal.push(obj[i]);
    }
}
console.log(objName,objVal);
}

看吧,这下就过滤掉game了。


image.png


1.hasOwnProperty()函数用于指示一个对象自身(不包括原型链)是否具有指定名称的属性。如果有,返回true,否则返回false。

2.说简单点,它能帮你指向你当前循环的对象,而过滤掉原型链上其它对象,因为在工作中我们很难保证其他人是否会修改原型链,这样做会更为保险。

3.因为 for in 循环总是遍历整个原型链,所以当遍历多继承的对象时效率较低。

4.为了检查某个对象是否拥有不在原型链上的自定义属性,就有必要用到 hasOwnProperty 方法,任何一个对象都具有该方法,它继承自 Object.prototype。

5.当检测某个对象是否拥有某个属性时,hasOwnProperty 是唯一可以完成这一任务的方法,在 for in 循环时,建议增加 hasOwnProperty 进行判断,可以有效避免扩展本地原型而引起的错误。

6.我们无法完全检测某个属性是否是undefined,因为属性有可能存在,但其值为undefined。

7.hasOwnProperty 是Javascript中唯一一个可以处理对象属性而不遍历原型链的方法。

hasOwnProperty()的主要作用就是在多重循环中过滤掉不符合条件的对象,减少遍历次数,和其他编程语言中的continue和break类似。


image.png


属性名的遍历


Symbol 作为属性名,遍历对象的时候,该属性不会出现在 for...in 、 for...of 循环中,也不 会被 Object.keys() 、 Object.getOwnPropertyNames() 、JSON.stringify() 返回。


但是,它也不是私有属性,有一个 Object.getOwnPropertySymbols() 方法,可以获取指定对象的所有 Symbol 属性名。该方法返回一个数组,成员是当前对象的所有用作属性名的 Symbol 值。

.  const obj = {};
.  let a = Symbol('a');
.  let b = Symbol('b');
.
.  obj[a] = 'Hello';
.  obj[b] = 'World';
.
.  const objectSymbols = Object.getOwnPropertySymbols(obj);
.
.  objectSymbols
.  // [Symbol(a), Symbol(b)]

下面是另一个例子, Object.getOwnPropertySymbols() 方法与 for...in 循

环、 Object.getOwnPropertyNames 方法进行对比的例子。

.  const obj = {};
.  const foo = Symbol('foo');
.
.  obj[foo] = 'bar';
.
.  for (let i in obj) {
.  console.log(i); // 无输出
.  }
.
.  Object.getOwnPropertyNames(obj) // []
.  Object.getOwnPropertySymbols(obj) // [Symbol(foo)]

另一个新的 API, Reflect.ownKeys() 方法可以返回所有类型的键名,包括常规键名和 Symbol键名

.  let obj = {
.  [Symbol('my_key')]: 1,
.  enum: 2,
.  nonEnum: 3
.  };
.
.  Reflect.ownKeys(obj)
.  // ["enum", "nonEnum", Symbol(my_key)]

由于以 Symbol 值作为键名,不会被常规方法遍历得到。我们可以利用这个特性,为对象定义一些非私有的、但又希望只用于内部的方法。


具体可以参考 https://www.cnblogs.com/zhenggc99/p/14718859.html



相关文章
|
小程序
小程序踩坑:Setting data field "xxxx" to undefined is invalid.
小程序踩坑:Setting data field "xxxx" to undefined is invalid.
818 0
若依框架----登录界面美化
若依框架----登录界面美化
1942 0
|
容器
Pyside6-第十三篇-布局(最后一章废话-理论篇)
Pyside6-第十三篇-布局(最后一章废话-理论篇)
1765 0
|
JavaScript 数据库 Windows
nodejs 将node命令启动为windows服务运行(node-windows使用)
nodejs 将node命令启动为windows服务运行(node-windows使用)
nodejs 将node命令启动为windows服务运行(node-windows使用)
|
8月前
|
存储 人工智能 物联网
给AI模型“瘦身”:LoRA微调技术,让你用消费级显卡玩转大模型
LoRA(低秩自适应)技术让大模型微调变得高效且低成本。它通过冻结原模型权重,仅训练小型适配矩阵,大幅减少显存占用与计算资源。相比全参数微调,LoRA在保持接近原模型性能的同时,可将可训练参数量降低至0.1%以下,使个人开发者用普通GPU也能微调7B级大模型。结合QLoRA、多任务融合与权重合并,LoRA已成为大模型落地应用的核心工具,真正实现“轻量化定制”。
|
监控 iOS开发 CDN
“企业微信iPad协议”凌晨沉默实验:当群发接口只剩心跳声
预热群发遇阻,企业微信iPad协议暗藏静默流控:5分钟超300条即限速,无报错仅返空ID。拆分50人群组,间隔65秒发送,启用CDN直传,终完成2987人触达,折叠率仅0.7%。接口沉默处,亦有信号。
540 0
|
存储 缓存 JavaScript
【Uniapp 专栏】深入剖析 Uniapp 的运行机制原理
【5月更文挑战第12天】Uniapp是一款基于Vue.js的跨平台前端框架,通过抽象不同平台的差异,实现一套代码多平台运行,提升开发效率。其架构包括视图层(基于Vue.js组件)、逻辑层(JavaScript处理业务逻辑)和数据层(管理应用数据)。运行时,Uniapp会根据目标平台转换代码并适配。关键技术包括Web标准、原生插件和运行时环境。优化措施包含代码分包、数据懒加载和缓存机制。借助HBuilderX等工具,开发者能高效地进行开发和测试。Uniapp的运行机制融合多种技术,为跨平台应用开发提供便利。
1573 2
【Uniapp 专栏】深入剖析 Uniapp 的运行机制原理
|
JavaScript 前端开发 Android开发
易语言按键精灵接单平台,易语言接单网,autojs接单平台
随着RPA(机器人流程自动化)需求激增,国内形成了以易语言、按键精灵、Auto.js为核心的三大
|
机器学习/深度学习 人工智能 运维
CodeFuse团队2024年10篇论文总结
CodeFuse 是蚂蚁集团开发的多语言代码大型语言模型(LLM),基于海量高质量代码数据和多任务微调技术,已在内部研发人员的编码、测试、运维等场景中广泛应用。2024年,CodeFuse 在国际顶会如ICSE、ICDE、KDD等发表多篇论文,涵盖CodeLLM、机器学习、AI等领域,并开源多个自研大模型,总下载量近200万。项目持续迭代,欢迎贡献和建议。
1029 11
|
分布式计算 安全 OLAP
7倍性能提升|阿里云AnalyticDB Spark向量化能力解析
AnalyticDB Spark如何通过向量化引擎提升性能?

热门文章

最新文章