Javascript数组研究09_Array.prototype[Symbol.unscopables]
Symbol.unscopables
是 JavaScript 中一个相对较新的符号(Symbol),用于控制对象属性在 with
语句中的可见性。它主要用于内置对象,如 Array.prototype
,以防止某些方法被引入到 with
语句的作用域中,避免潜在的命名冲突和意外覆盖。
Symbol.unscopables 简介
-
符号(Symbol):
- 在 ECMAScript 6 中引入,符号是一种新的基本数据类型,用于创建独一无二的标识符。
-
Symbol.unscopables
:- 是一个内置符号,用于定义哪些属性在使用
with
语句时 不会 被引入到作用域中。 - 它的值通常是一个对象,属性名对应要排除的属性,属性值为
true
表示该属性在with
语句中不可见。
-Array.prototype[Symbol.unscopables]
的属性特性
- 是一个内置符号,用于定义哪些属性在使用
属性特性 | 是/否 |
---|---|
可写 | 否 |
可枚举 | 否 |
可配置 | 是 |
- 原型是
null
:- 因此不会意外地使
Object.prototype
属性(比如toString
)变为非作用域属性,而令在with
语句中调用数组的toString()
方法仍然有效。
- 因此不会意外地使
为什么需要 Symbol.unscopables
-
with
语句的作用:with
语句用于将一个对象的属性作为当前作用域的变量。这在某些情况下可以简化代码,但也可能导致命名冲突和调试困难。
const obj = { a: 1, b: 2 }; with (obj) {console.log(a); // 1console.log(b); // 2 }
-
潜在问题:
- 当对象拥有与当前作用域中已有变量相同名称的属性时,会导致意外覆盖。
- 为了解决这个问题,JavaScript 提供了
Symbol.unscopables
,允许对象指定哪些属性在with
语句中不可见。
Array.prototype[Symbol.unscopables] 的工作原理
-
内置排除:
- 为了防止数组方法(如
keys
,values
,entries
等)在with
语句中引起冲突,Array.prototype
定义了Symbol.unscopables
属性。
- 为了防止数组方法(如
-
示例:
console.log(Array.prototype[Symbol.unscopables]); // 输出: // { // copyWithin: true, // entries: true, // fill: true, // find: true, // findIndex: true, // includes: true, // keys: true, // values: true // }
- 这意味着在
with (array)
语句中,这些方法不会被自动引入到作用域中。
- 这意味着在
-
目的:
- 确保在使用
with
语句时,数组的方法不会覆盖作用域中已有的变量或函数,避免命名冲突。
- 确保在使用
使用 Symbol.unscopables 的示例
示例 1:默认行为
const array = [1, 2, 3];with (array) {console.log(length); // 3console.log(keys); // ReferenceError: keys is not defined
}
- 解释:
length
是数组的一个属性,没有被排除,因此可以在with
语句中直接访问。keys
是数组的方法,并被Symbol.unscopables
排除,因此在with
语句中不可见,导致ReferenceError
。
示例 2:自定义对象使用 Symbol.unscopables
假设您有一个自定义对象,并希望在 with
语句中排除某些属性:
const myObject = {a: 10,b: 20,c: 30,[Symbol.unscopables]: {b: true}
};with (myObject) {console.log(a); // 10console.log(b); // ReferenceError: b is not definedconsole.log(c); // 30
}
- 解释:
- 属性
b
被Symbol.unscopables
排除,因此在with
语句中无法访问,导致ReferenceError
。 - 属性
a
和c
没有被排除,可以正常访问。
- 属性
示例 3:实现自定义 unscopables
const myArray = [1, 2, 3];// 自定义方法
myArray.customMethod = function() {return 'custom';
};// 定义 unscopables
myArray[Symbol.unscopables] = {customMethod: true
};with (myArray) {console.log(customMethod); // ReferenceError: customMethod is not defined
}
- 解释:
- 尽管
myArray
拥有customMethod
,但通过Symbol.unscopables
排除了该方法在with
语句中的可见性。
- 尽管
注意事项
-
with
语句的局限性:with
语句在严格模式下是禁止的,因为它会导致作用域链的不明确和潜在的性能问题。
'use strict'; const obj = { a: 1 }; with (obj) { // SyntaxError: Strict mode code may not include a with statementconsole.log(a); }
-
类数组对象的 unscopables:
- 像
Array.prototype
这样的内置对象通常会定义Symbol.unscopables
,确保其方法不会在with
语句中意外引入,从而保持代码的健壮性。
- 像
总结
Symbol.unscopables
是一个用于控制对象属性在 with
语句中可见性的符号属性。它允许对象明确指定哪些属性在使用 with
语句时应被排除,防止命名冲突和意外覆盖。尽管 with
语句在现代 JavaScript 开发中不推荐使用,理解 Symbol.unscopables
有助于深入了解 JavaScript 语言的设计和内置对象的行为。
如果您正在开发需要处理作用域链或动态属性访问的高级功能,了解并合理使用 Symbol.unscopables
将是有益的。然而,对于大多数日常开发任务,遵循明确的作用域管理和避免使用 with
语句是更好的选择。
相关文章:

Javascript数组研究09_Array.prototype[Symbol.unscopables]
Symbol.unscopables 是 JavaScript 中一个相对较新的符号(Symbol),用于控制对象属性在 with 语句中的可见性。它主要用于内置对象,如 Array.prototype,以防止某些方法被引入到 with 语句的作用域中,避免潜在…...

SkyWalking 自定义链路追踪
对项目中的业务方法,实现链路追踪,方便我们排查问题 引入依赖 <!‐‐ SkyWalking 工具类 ‐‐> <dependency> <groupId>org.apache.skywalking</groupId> <artifactId>apm‐toolkit‐trace</artifactId> <vers…...

Linux驱动开发(速记版)--设备模型
第八十章 设备模型基本框架-kobject 和 kset 80.1 什么是设备模型 设备模型使Linux内核处理复杂设备更高效。 字符设备驱动适用于简单设备,但对于电源管理和热插拔,不够灵活。 设备模型允许开发人员以高级方式描述硬件及关系,提供API处理设备…...

动手学深度学习(李沐)PyTorch 第 6 章 卷积神经网络
李宏毅-卷积神经网络CNN 如果使用全连接层:第一层的weight就有3*10^7个 观察 1:检测模式不需要整张图像 很多重要的pattern只要看小范围即可 简化1:感受野 根据观察1 可以做第1个简化,卷积神经网络会设定一个区域,…...

新编英语语法教程
新编英语语法教程 1. 新编英语语法教程 (第 6 版) 学生用书1.1. 目录1.2. 电子课件 References A New English Grammar Coursebook 新编英语语法教程 (第 6 版) 学生用书新编英语语法教程 (第 6 版) 教师用书 1. 新编英语语法教程 (第 6 版) 学生用书 https://erp.sflep.cn/…...

Golang 服务器虚拟化应用案例
推荐学习文档 golang应用级os框架,欢迎stargolang应用级os框架使用案例,欢迎star案例:基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识,这里有免费的golang学习笔…...

Elasticsearch基础_4.ES搜索功能
文章目录 一、搜索辅助功能1.1、指定返回的字段1.2、结果计数1.3、结果分页 二、搜索匹配功能2.1、查询所有文档2.2、term级别查询2.2.1、term查询2.2.2、terms查询2.2.3、range查询2.2.4、exists查询 2.3、布尔查询2.3.1、must,should,must_not2.3.2、f…...

Elasticsearch要点简记
Elasticsearch要点简记 1、ES概述2、基础概念(1)索引、文档、字段(2)映射(3)DSL 3、架构原理4、索引字段的数据类型5、ES的三种分页方式(1)深度分页(fromsize)…...

【通信协议】IIC通信协议详解
IIC(Inter-Integrated Circuit)通信协议,又称为I2C(Inter-Integrated Circuit 2)协议,是一种广泛使用的串行通信协议。它由Philips Semiconductor(现NXP Semiconductors)开发&#x…...

2024年中国科技核心期刊目录(社会科学卷)
2024年中国科技核心期刊目录 (社会科学卷) 序号 期刊代码 期刊名称 1 SC02 JOURNAL OF S…...

用Python集成免费IP归属地查询API
IP查询的优势是什么? IP查询是一种强大的工具,能够快速提供关于IP地址的信息,如地理位置、互联网服务提供商(ISP)、连接类型等。这些数据在多种场景下都非常有用,帮助用户理解网络环境和用户行为。 首先&…...

C 数组
C 数组 数组是C语言中的一种基本数据结构,用于存储一系列相同类型的数据。它是连续的内存分配,允许通过索引快速访问元素。本文将详细介绍C数组的概念、使用方法、以及注意事项。 1. 数组的概念 数组是一个集合,可以存储一定数量的元素。在…...

【Unity】unity安卓打包参数(个人复习向/有不足之处欢迎指出/侵删)
1.Texture Compression 纹理压缩 设置发布后的纹理压缩格式 Use Player Settings:使用在播放器设置中设置的纹理压缩格式 ETC:使用ETC格式(兼容) ETC2:使用ETC2格式(很多设备不支持) ASTC:使用…...

C0016.Clion中qDebug()打印输出中文时,都是问号??????的解决办法
问题描述 在clion中使用qDebug打印输出中文内容时,都是?????如下图: 注意:修改该文件的编码格式就行,该文件名为apr.cpp; 解决办法...

C++ priority_queue 优先队列构造大根堆和小根堆
priority_queue的三个参数 template <class T, class Container std::vector<T>, class Compare std::less<typename Container::value_type>> class priority_queue;1、元素类型 2、底层容器类型,默认vector 3、比较函数(传入的是…...

音视频入门基础:FLV专题(9)——Script Tag简介
一、SCRIPTDATA 根据《video_file_format_spec_v10_1.pdf》第75页到76页,如果某个Tag的Tag header中的TagType值为18,表示该Tag为Script Tag(脚本Tag,又称Data Tag、SCRIPTDATA tag)。这时如果Filter的值不为1表示未加…...

Vue页面,基础配置
最简单页面 日期范围及字符搜索,监听器处理日期范围搜索控件清空重置问题导出、导出文件文件名称带日期时间表格日期指定格式显示。。。 <template><div class"app-container"><el-form :model"queryParams" ref"queryForm…...

(杨辉三角) 攻防世界--->notsequence
学习笔记。(不想看可以直接跳正文。) 前言:仿佛又回到高中 - - 只不过,是以另一种形式再次出现。 学习思维为主,做题位次。(后面再补。) 前置知识: 什么是杨辉三角: 杨辉三角_百度百科 (bai…...

【CTF Web】Pikachu CSRF(get) Writeup(CSRF+GET请求+社会工程学)
CSRF(跨站请求伪造)概述 Cross-site request forgery 简称为“CSRF”,在CSRF的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接),然后欺骗目标用户进行点击,用户一旦点击了这个请求,整个攻击就完成…...

智能工厂的软件设计 作为“程序Program”的中台 之2
Q11、现在,我们再重新理解一下前面所说:三种中台(数据中台、技术中台和业务中台)作为这个整体的三个整子Holon,合起来是一个 融合了三分法( 三分部 的三个中台构成三段式 程序框架,分别用 <h…...

GB28181信令交互流程及Android端设备对接探讨
GB28181规范必要性 好多开发者在做比如执法记录仪、智能安全帽、智能监控等设备端视频回传技术方案选型的时候,不清楚到底是用RTSP、RTMP还是GB28181,对GB28181相对比较陌生,我们就GB28181规范的必要性,做个探讨: 实现…...

OpenCV视频I/O(14)创建和写入视频文件的类:VideoWriter介绍
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 视频写入器类。 该类提供了用于写入视频文件或图像序列的 C API。 cv::VideoWriter 类是 OpenCV 库中用于创建和写入视频文件的一个类。它提供了…...

c语言学习(书本目录)
关键字 变量 3.typedef的使用: 定义一个结构体,名字是Person: struct Person { char name[50]; int age; }; 给结构体取一个别名:struct Person---》Person typedef struct Person Person; 上面带标签的结构体等效于 …...

2024年最新版本神马TV8.5影视APP源码 293TV影视点播系统源码搭建教程 神马TV8.2加强版反编译教程 保姆级小白可搭建 完整版本视频教程
2024年最新版的神马TV影视APP源码,版本号8.5,提供了前所未有的定制化选项和高级功能。用户可以轻松更换应用的包名和名称,确保品牌个性化。此外,该应用采用了动态域名加密技术,增强了数据传输的安全性。它支持自动切换…...

衍生品交易的隐藏风险:认识CCR和xVA
作为一名资深的量化交易专家和金融自媒体人,我经常被问到:"衍生品交易真的像传说中那么危险吗?"这个问题背后,隐藏着许多投资者对金融市场的担忧和好奇。今天,让我们一起揭开衍生品交易中两个关键概念的面纱…...

我的项目管理生涯
1 前言 从好几年前就想写几篇关于自己职业生涯的文章了,一直由于各种原因没有写成,正好借新的工作机会,尤其是项目管理这段工作经历,计划通过这一二篇文章进行总结和反思一下,以期更顺利的开展相关工作或是自己能更上…...

ChatGPT Canvas:交互式对话编辑器
自两年前 ChatGPT 发布以来,主流 AI 均以对话形式进行交互。传统的对话式界面可以直观看到反馈结果,但在需要深度编辑和协作的项目中就略显局限。为了解决此问题,几个月前 Claude 就发布过 Artifacts 功能,用来拓展原有对话。而现…...

[Linux] Linux 的进程如何调度——Linux的 O(1)进程调度算法
标题:[Linux] Linux 的进程如何调度——优先级与进程调度 个人主页水墨不写bug 目录 一、前言 二、将要出现的概念 1.进程调度队列 2.位图 3.进程的优先级 三、Linux进程的调度过程 1.活动队列(*active指向的队列) 2.过期队列&#…...

Python使用Selenium动态爬取CSDN社区帖子的URL链接
前几天读了一篇CSDN社区的帖子,发现文章内容写得极好,值得借鉴学习。于是我想将那个社区的帖子都爬下来,但是那个社区发布的贴子挺多的,一直往下拉才到2022年5月的发布。于是我就只将5月份之前的爬下来就行,但是帖子是…...

【ShuQiHere】双系统指南:如何在 Linux 系统情况下安装 Windows 11,处理引导与网络问题 ️
【ShuQiHere】 🖥️💡 在安装 Windows 11 和 Linux 双系统时,常常会遇到各种棘手的问题,特别是在网络连接、BIOS 设置和引导修复方面。今天我将详细带你解决这些问题,让你顺利完成 Windows 11 安装,并恢复…...