ES6 Symbol类型
ES6 Symbol类型:
ES5 的对象属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有方法产生冲突。如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突。这就是 ES6 引入Symbol的原因。es6引入Symbol数据类型(已有Number 、 String 、 Boolean 、 Objec t、 null 和 undefined 类型);
Symbol 值通过Symbol函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol 类型。凡是属性名属于 Symbol 类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。
<script type="text/javascript"> let s=Symbol(); console.log(s);//Symbol() console.log(typeof(s));//symbol let s1=Symbol(); console.log(s==s1);//false 凡是属性名属于 Symbol 类型,就都是独一无二的 </script>
Symbol实际使用
<script type="text/javascript"> //Symbol属性的使用 let s = Symbol('sex');//定义属性,参数即属性名 let obj = {name:'jack',age:18}; //向对象里添加额外的属性 //obj.sex='man';//以前的写法,有时属性多的时候会出现属性重复 obj[s] = 'man';//这样能保障属性不重复 console.log(obj,obj[s])//Symbol的属性不能直接用.接属性名 //Symbol属性的遍历 let obj1={name:'jack'}; let s1=Symbol('name'); let s2=Symbol('sex'); obj1[s1]='jack'; obj1[s2]='woman'; for(let i in obj1){//常规遍历无法遍历Symbol属性 console.log(i);//name } console.log(Object.getOwnPropertySymbols(obj1) )//[Symbol(name), Symbol(sex)] 获取所有 Symbol 属性名 console.log(Object.getOwnPropertyNames(obj1))//["name"] 无法获取Symbol 属性名 console.log(Reflect.ownKeys(obj1)) //["name", Symbol(name), Symbol(sex)] 获取所有的属性名 //因为Symbol具有唯一性,所以我们可以做Symbol定义常量 const System_key=Symbol('114aaa'); console.log(System_key); //Symbol.for() // Symbol.for() 全局搜索指定key的Symbol,找到的话,就返回该Symbol,找不到,就新建一个 let s3 = Symbol.for('foo'); let s4 = Symbol.for('foo'); console.log(s3==s4);//true //Symbol.for()与Symbol()这两种写法,都会生成新的 Symbol。 // 它们的区别是,前者会被登记在全局环境中供搜索,后者不会。 // Symbol.for()不会每次调用就返回一个新的 Symbol 类型的值,而是会先检查给定的key是否已经存在, // 如果不存在才会新建一个值 console.log(Symbol.for("bar") === Symbol.for("bar"))//true console.log(Symbol("bar") === Symbol("bar")) //false //Symbol.keyFor() // Symbol.keyFor() 返回一个已登记的 Symbol 类型值的 key ,用来检测该字符串参数作为名称的 Symbol 值是否已被登记。 let s5 = Symbol.for("foo"); console.log(Symbol.keyFor(s5))//"foo" let s6 = Symbol("foo"); console.log(Symbol.keyFor(s6));// undefined </script>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具