枚举不理解?一文让你醍醐灌顶

一、什么是枚举?先做 1 个生活化类比(核心)

JavaScript 对象想象成一个抽屉,属性就是抽屉里的文件:

  • 「可枚举」的文件:贴了「可展示」标签 → 别人来翻你的抽屉(遍历),能看到这份文件;
  • 「不可枚举」的文件:没贴「可展示」标签 → 别人翻抽屉看不到,但你自己知道文件在哪,能直接拿出来用

枚举(enumerable)就是这个「可展示」标签 ------ 唯一作用:决定属性是否能被 "遍历工具" 看到,和属性本身是否存在、能否使用无关。

二、 用 3 行极简代码,看遍枚举的所有区别

我只写最核心的代码,逐行解释,你可以直接复制到浏览器控制台运行:

js 复制代码
// 1. 创建抽屉(对象),放1个"可展示"文件(默认可枚举属性)
const drawer = {
  文件A: "购物清单" // 没特殊说明,默认贴"可展示"标签(可枚举)
};

// 2. 往抽屉里加1个"不可展示"文件(手动设为不可枚举)
Object.defineProperty(drawer, "文件B", {
  value: "私密日记", // 文件内容
  enumerable: false // 核心:撕掉"可展示"标签(不可枚举)
});

// 3. 演示:别人翻抽屉(遍历)能看到什么?
console.log("别人翻抽屉看到的:", Object.keys(drawer)); 
// 输出:别人翻抽屉看到的:['文件A'] → 只看到可枚举的文件A

// 4. 演示:你自己拿文件(直接访问)能拿到什么?
console.log("你直接拿文件A:", drawer.文件A); // 输出:购物清单
console.log("你直接拿文件B:", drawer.文件B); // 输出:私密日记 → 虽然看不到,但能直接用!

三、 再补 1 个最常用的 "遍历工具" 对比(只看枚举的影响)

还是用上面的 drawer 对象,看最常用的 for...in 遍历:

js 复制代码
// 别人翻抽屉(for...in遍历)
console.log("遍历结果:");
for (let 文件名称 in drawer) {
  console.log(文件名称); // 只输出"文件A" → 还是看不到文件B
}

四、 关键追问:为什么要搞 "不可枚举"?

举个实际开发的例子:你写了一个用户对象,想存「公开信息」和「私密信息」:

js 复制代码
const user = {
  昵称: "小明", // 公开(可枚举,别人能看到)
};
// 身份证号是私密的,设为不可枚举
Object.defineProperty(user, "身份证号", {
  value: "110xxxx",
  enumerable: false
});

// 场景1:展示用户信息(遍历)→ 只显示公开的昵称,不会泄露身份证号
console.log("用户公开信息:", Object.keys(user)); // ['昵称']

// 场景2:后台验证(直接访问)→ 能拿到身份证号做校验
console.log("验证身份:", user.身份证号); // 110xxxx

五、 总结(只记 2 个核心点,多了不记)

  1. 枚举的唯一作用 :给属性贴 "可展示" 标签,决定 Object.keys()for...in 等「遍历工具」能不能看到这个属性;
  2. 关键区别:不可枚举的属性只是 "隐身",不是 "消失"------ 遍历看不到,但能直接访问使用。

以上就是本次的学习分享,欢迎大家在评论区讨论指正,与大家共勉。

我是 Eugene,你的电子学友。

如果文章对你有帮助,别忘了点赞、收藏、加关注,你的认可是我持续输出的最大动力~

相关推荐
mCell4 小时前
如何零成本搭建个人站点
前端·程序员·github
mCell5 小时前
为什么 Memo Code 先做 CLI:以及终端输入框到底有多难搞
前端·设计模式·agent
恋猫de小郭5 小时前
AI 在提高你工作效率的同时,也一直在增加你的疲惫和焦虑
前端·人工智能·ai编程
少云清5 小时前
【安全测试】2_客户端脚本安全测试 _XSS和CSRF
前端·xss·csrf
萧曵 丶5 小时前
Vue 中父子组件之间最常用的业务交互场景
javascript·vue.js·交互
银烛木5 小时前
黑马程序员前端h5+css3
前端·css·css3
m0_607076605 小时前
CSS3 转换,快手前端面试经验,隔壁都馋哭了
前端·面试·css3
听海边涛声5 小时前
CSS3 图片模糊处理
前端·css·css3
IT、木易5 小时前
css3 backdrop-filter 在移动端 Safari 上导致渲染性能急剧下降的优化方案有哪些?
前端·css3·safari
0思必得06 小时前
[Web自动化] Selenium无头模式
前端·爬虫·selenium·自动化·web自动化