ES6 Symbol (十三)
创始人
2025-01-11 02:07:03
0次
  1. ES5的对象属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有方法产生冲突。如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突。这就是 ES6 引入 Symbol 的原因。
  2. ES6引入了一种新的原始数据类型Symbol,表示独一无二的值。它是 JavaScript 语言的第七种数据类型,前六种是: undefined 、 null 、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)。

主要特性:

  • 唯一性:每个通过 Symbol() 创建的符号都是唯一的。
  • 不可变性:Symbol 值是不可变的,不能被更改。
  • 原始类型:Symbol 是一种原始类型,不是对象。
  • 全局Symbol注册表:所有创建的Symbol都会被注册到全局Symbol注册表中,以确保它们的唯一性。
  • 作为属性键:Symbol 常用作对象属性的键,可以避免属性名冲突。
  • 内置Symbol:ES6 定义了一些内置的 Symbol,如 Symbol.iterator。

用法:

创建Symbol:使用 Symbol() 创建一个新的 Symbol 值。
作为属性键:使用 Symbol 作为对象属性的键,确保属性的唯一性。
内置Symbol:使用 ES6 内置的 Symbol,如 Symbol.iterator 来实现自定义迭代器。

1. 创建和使用Symbol

let mySymbol = Symbol('mySymbol');  let object = {     [mySymbol]: 'This is a unique property' };  console.log(object[mySymbol]); // 输出:This is a unique property 

2. Symbol作为属性键

let uniqueKey = Symbol();  let obj = {     [uniqueKey]: 'This property key is unique' };  console.log(obj[uniqueKey]); // 输出:This property key is unique 

3:内置Symbol Symbol.iterator

let myIterable = {     [Symbol.iterator]: function* () {         yield 1;         yield 2;         yield 3;     } };  [...myIterable]; // 使用扩展运算符和Symbol.iterator进行迭代 // 输出:[1, 2, 3] 

4. Symbol的不可变性和唯一性

let sym1 = Symbol('sym1'); let sym2 = Symbol('sym1');  console.log(sym1 === sym2); // 输出:false,证明Symbol是唯一的  // 尝试修改Symbol的描述 try {     sym1.description = 'New description'; } catch (e) {     console.error(e); // Symbol属性是不可变的,这将抛出错误 } 

5. 使用Symbol避免属性名冲突

let obj = {     id: '123',     [Symbol('key')]: 'secret' };  console.log(obj.id); // 输出:123 console.log(obj[Symbol('key')]); // 输出:secret // 其他代码无法通过猜测 'key' 属性名来访问 'secret' 属性 

6. 使用Symbol检查属性

let mySymbol = Symbol('mySymbol'); let obj = {[mySymbol]: 'This is unique'};  if (mySymbol in obj) {     console.log('Property exists'); // 输出:Property exists }  // 检查属性是否存在于对象的自身属性中,不包括原型链 if (Object.hasOwnProperty.call(obj, mySymbol)) {     console.log('Property is own property'); // 输出:Property is own property } 

Symbol使用注意事项:

  1. Symbol 值不能被隐式地转为字符串或数字,如果需要进行转换,可以使用 String() 函数或 Number() 函数。
  2. Symbol 作为属性键时,不能使用点操作符访问,必须使用方括号 []。
  3. 由于 Symbol 的唯一性,它常用于防止属性名冲突,实现私有属性的效果。

相关内容

热门资讯

实测交流透视挂!宝玛大厅ai智... 实测交流透视挂!宝玛大厅ai智能透视挂教程,宝玛大厅破解软件经验(本来有挂辅助)1、每一步都需要思考...
总算了解辅助器!朱雀吴江三缺一... 总算了解辅助器!朱雀吴江三缺一ai智能透视辅助挂技巧,朱雀吴江三缺一好像是有挂(有辅助挂细节)朱雀吴...
今日公布透视!九五至尊大厅ai... 今日公布透视!九五至尊大厅ai智能透视插件,九五至尊大厅有没有透视挂窍门(切实有挂技术)1、在九五至...
玩家必看科普开挂!聚闲麻将ai... 玩家必看科普开挂!聚闲麻将ai智能透视辅助挂软件,聚闲麻将总是真的有挂(有辅助挂方式)聚闲麻将能透视...
据报道开挂!旅游娱乐ai智能开... 据报道开挂!旅游娱乐ai智能开挂工具,旅游娱乐辅助工具演示(一直有挂教学)1、全新机制【旅游娱乐ai...
一分钟揭秘开挂!决胜朋来麻将a... 一分钟揭秘开挂!决胜朋来麻将ai智能透视辅助挂教程,决胜朋来麻将真是真的是有挂(有辅助挂总结)1、首...
如何分辨真伪透视!红牛ai智能... 如何分辨真伪透视!红牛ai智能透视攻略,红牛是不是有挂经验(真是有挂技术)1、操作简单,无需红牛手机...
2分钟细说辅助器!江湖大庆麻将... 2分钟细说辅助器!江湖大庆麻将ai智能透视辅助挂攻略,江湖大庆麻将竟然是真的有挂(有辅助挂头条)1、...
总算清楚透视挂!老夫子厅ai智... 总算清楚透视挂!老夫子厅ai智能透视挂技巧,老夫子厅怎么开挂课程(好像发现有挂)老夫子厅破解侠是真的...
解密关于辅助!菜鸟麻将ai智能... 解密关于辅助!菜鸟麻将ai智能透视辅助挂脚本,菜鸟麻将总是存在有挂(有辅助挂存在)1、用户打开应用后...