【JS】for in可能遇到的问题

问题一:for in 打印属性顺序与定义顺序不一致

先来做一道题,请说出打印结果

const obj = {a2: 'aaa',2: 'aaa',1: 'aaaa',a1: 'aaa',
}for(let key in obj){console.log(key)
}

结果: 1 2 a2 a1

属性的书写顺序不一定就是对象遍历时的顺序。这涉及到了浏览器对于内存的管理。
因为JS会对对象的属性进行处理,会把所有Number类型的属性提前,然后将Number类型的属性按照升序排序。

为什么这么做?
浏览器为了提高运行的效率,因为Number类型的属性便于运算,方便定位内存地址,但String类型的属性无序,查找速度不如Number。

问题二:prototype属性的遍历

在Object原型上添加了静态属性c,可以发现for in遍历时可以访问到c属性。

let obj = { a: 1, b: 2 }
Object.prototype.c = function () { console.log('c') }
for (let key in obj) { console.log(key, obj[key]) }

在这里插入图片描述

打印Object.prototype可以发现,不止刚刚定义的c,还有很多其他静态方法,为什么没被打印呢

在这里插入图片描述

因为任何一个对象的属性都会对应一个 「属性描述符」,这里使用Object.getOwnPropertyDescriptor方法查看对象某个属性的属性描述符。

语法:Object.getOwnPropertyDescriptor(obj,key) 「obj:对象,key:obj上的某个属性名 」

返回值:对象上一个自有属性对应的属性描述符。

  • configurable (可配置性): 表示属性是否可以被删除或者修改属性描述符,默认为 false。如果属性是从原型链上继承来的,那么该属性值为 false。
  • enumerable (可枚举性): 表示属性是否可以通过 for…in 循环或者 Object.keys() 方法遍历到,默认为 false。如果属性是从原型链上继承来的,那么该属性值为 false。
  • value (属性值): 表示属性的值。对于数据属性来说,这个值是属性的值。对于存取器属性来说,这个值是 undefined。
  • writable (可写性): 表示属性是否可以被赋值运算符修改,默认为 false。如果属性是从原型链上继承来的,那么该属性值为 false。
const desc = Object.getOwnPropertyDescriptor(Object.prototype,'c') 
console.log(desc)

打印结果为:

在这里插入图片描述
可以看到,刚刚添加的属性c的enumerable为true,即可以遍历,所以for in才能正确拿到c属性。

打印静态方法toString,可以发现enumerable为false,即不可遍历。

const desc = Object.getOwnPropertyDescriptor(Object.prototype,'toString') 
console.log(desc)

在这里插入图片描述

可以使用 Object.defineProperty 修改属性描述符,这里继续操作c,将其变为不可枚举,即enumerable:false。

Object.defineProperty(Object.prototype, 'c', {value: () => { console.log('c') },writable: true,enumerable: false,configurable: true
})

再次for in遍历属性发现:c也不再被打印。

for (let key in obj) { console.log(key, obj[key]) }

在这里插入图片描述

更多Object静态方法可以查看另一篇文章:Object静态方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/282174.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

边缘自动隐藏窗体,透明度切换,同步父窗体标签切换winform

一、实现功能 默认的标签栏(superTabControl) 可以设置隐藏,即可实现全屏最大化。通过列表切换打开的标签页。用于定制B/S模式系统显示更个性,自定义样式,简介 安全 兼容性好。 二、主要代码 private void Time_Tick(object sender, EventArgs e) {获取主屏

《深入解析 C#》—— C# 3 部分

文章目录 第三章 C#3:LINQ及相关特性3.1 自动实现属性(*)3.2 隐式类型 var(*)3.3 对象和集合初始化3.3.1 对象初始化器3.3.2 集合初始化器 3.4 匿名类型3.4.1 基本语法和行为3.4.2 编译器生成类型3.4.3 匿名类型的局限…

#Linux(文件系统概念)

(一)发行版:Ubuntu16.04.7 (二)记录: (1)查看文件系统情况df,man df查看df命令的功能 (2)查看文件系统的类型 df-T (3)df …

四川易点慧电子商务抖音小店:安全可靠,购物新选择

在数字化浪潮席卷全球的今天,电子商务已成为人们生活中不可或缺的一部分。四川易点慧电子商务抖音小店作为新兴的电商平台,以其安全可靠、便捷高效的特点,逐渐赢得了广大消费者的青睐。今天,就让我们一起走进四川易点慧电子商务抖…

前端项目部署后,如何提示用户版本更新

目录 前言解决方案1、public目录下新建manifest.json2、写入当前时间戳到manifest.json3、检查版本更新4、woker线程5、入口文件引入 可能出现的问题好书推荐 前言 项目部署上线后,特别是网页项目,提示正在操作系统的用户去更新版本非常 important。一般…

【开发环境搭建篇】Redis客户端安装和配置

作者介绍:本人笔名姑苏老陈,从事JAVA开发工作十多年了,带过大学刚毕业的实习生,也带过技术团队。最近有个朋友的表弟,马上要大学毕业了,想从事JAVA开发工作,但不知道从何处入手。于是&#xff0…

UniTask 异步任务

文章目录 前言一、UniTask是什么?二、使用步骤三、常用的UniTask API和示例1.编写异步方法2.处理异常3.延迟执行4.等待多个UniTask或者一个UniTas完成5.异步加载资源示例6.手动控制UniTask的完成状态7.UniTask.Lazy延迟任务的创建8.后台线程切换Unity主线程9.不要返…

力扣爆刷第102天之hot100五连刷96-100

力扣爆刷第102天之hot100五连刷96-100 文章目录 力扣爆刷第102天之hot100五连刷96-100一、136. 只出现一次的数字二、169. 多数元素三、75. 颜色分类四、31. 下一个排列五、287. 寻找重复数 一、136. 只出现一次的数字 题目链接:https://leetcode.cn/problems/sing…

C语言字符函数与字符串函数:编织文字的舞会之梦(下)

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看,已成习惯 创作不易,多多支持! 目录 七、strncpy的使用以及模拟实现 八、strncat的使用以及模拟实现 九、strncmp的使用以及模拟实现 十、strstr的使用以及模拟…

设计模式之抽象工厂模式解析

抽象工厂模式 1)问题 工厂方法模式中的每个工厂只生产一类产品,会导致系统中存在大量的工厂类,增加系统的开销。 2)概述 a)产品族 和 产品等级结构 产品等级结构:产品的继承结构; 产品族&…

华为ensp中ospf基础 原理及配置命令(详解)

CSDN 成就一亿技术人! 作者主页:点击! ENSP专栏:点击! CSDN 成就一亿技术人! ————前言———— OSPF 的全称是 Open Shortest Path First,意为“开放式最短路径优先”。是一种内部网关协…

银行OA系统|基于SpringBoot架构+ Mysql+Java+ B/S结构的银行OA系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java,ssm,springboot的平台设计与实现项目系统开发资源(可…

Occupancy 训练策略

损失函数 Dice Loss Dice Loss 是一种用于图像分割的损失函数,其灵感来自于Dice 系数,是一种衡量两个样本相似度的方法。Dice 系数定义为: Dice 系数 2 * TP / (2 * TP FP FN) 其中: TP:预测为正且真实值为正的像…

网易有道 3/22

一面还比较常规,二面真的是压力爆炸,还是感觉自己太菜了 一面计网部分直接就是垮了,二面的话面试官水平很高,根本就和我不是一个级别的,三言两语就知道了我的项目大致情况,然后不断拷打 项目问完了又问了…

OpenGL学习笔记【3】—— GLAD配置

一、为什么用GLAD 由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询。所以任务就落在了开发者身上,开发者需要在运行时获取函数地址并将其保存在一个函数指针中供以后使用。取得地址的方法因平台而异&…

超声波清洗机是用来干什么的?好用眼镜超声波清洗机不能错过

在快节奏的现代生活中,每一项提高效率和清洁效果的技术都值得我们关注。超声波清洗机就是这样一种技术的完美体现,它通过高频声波在液体中产生微小的气泡,这些气泡在压力作用下迅速爆炸,产生的强大冲击力能够深入物品的微小缝隙&a…

阿里云权益中心2024年五大上云优惠权益解析,助力用户优惠上云

上云首选,普惠好价,2024年阿里云通过权益中心为个人和企业用户提供五大上云优惠权益,为开发者和企业提供多款新老同享、续费同价产品;超150款免费试用产品;初创企业最高可得最低3500元,最高100万上云抵扣金…

Docker 安装 Skywalking以及UI界面

关于Skywalking 在现代分布式系统架构中,应用性能监控(Application Performance Monitoring, APM)扮演着至关重要的角色。本文将聚焦于一款备受瞩目的开源APM工具——Apache Skywalking,通过对其功能特性和工作原理的详细介绍&am…

Unity UGUI之Toggle基本了解

在Unity中,Toggle一般用于两种状态之间的切换,通常用于开关或复选框等功能。 它的基本属性如图: 其中, Interactable(可交互):指示Toggle是否可以与用户交互。设置为false时,禁用To…

Leetcode 70.爬楼梯

心路历程: 这道题是之前学院的一道复试题,大家都没怎么刷过算法题,只记得当年凭借几次试错自己把这道题做出来了,当时也不知道动态规划之类的。 正常来讲,这种找不到循环结构的题一般都是递归解决。 注意的点&#x…