ES6 Symbol (十三)

  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 的唯一性,它常用于防止属性名冲突,实现私有属性的效果。

相关推荐

  1. ES6 Symbol

    2024-07-16 22:12:01       24 阅读
  2. ES6笔记-symbol

    2024-07-16 22:12:01       47 阅读
  3. ES6Symbol详解

    2024-07-16 22:12:01       30 阅读
  4. ES6新增的 Symbol

    2024-07-16 22:12:01       63 阅读
  5. ES6之原始数据类型Symbol

    2024-07-16 22:12:01       47 阅读
  6. 详解ES6中的symbol

    2024-07-16 22:12:01       54 阅读
  7. es6Symbol 独一无二的值

    2024-07-16 22:12:01       25 阅读
  8. ES6中新增的基本数据类型----symbol

    2024-07-16 22:12:01       47 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-16 22:12:01       75 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-16 22:12:01       80 阅读
  3. 在Django里面运行非项目文件

    2024-07-16 22:12:01       64 阅读
  4. Python语言-面向对象

    2024-07-16 22:12:01       75 阅读

热门阅读

  1. 通义灵码初体验_在Visual Studio Code中编写python代码

    2024-07-16 22:12:01       21 阅读
  2. 代码指导“Kimi”比“文心一言”香

    2024-07-16 22:12:01       20 阅读
  3. Spring源码注解篇三:深入理解@Component注解

    2024-07-16 22:12:01       25 阅读
  4. git开发流程

    2024-07-16 22:12:01       21 阅读
  5. 5. 基于Embedding实现超越elasticsearch高级搜索

    2024-07-16 22:12:01       25 阅读
  6. 业务需求方面

    2024-07-16 22:12:01       20 阅读
  7. ABC分析模型详解

    2024-07-16 22:12:01       20 阅读
  8. Ceph资源池pool管理

    2024-07-16 22:12:01       18 阅读
  9. 常用知识点问答

    2024-07-16 22:12:01       22 阅读
  10. MongoDB 面试题及答案整理,最新面试题

    2024-07-16 22:12:01       20 阅读
  11. 记录一次Android推流、录像踩坑过程

    2024-07-16 22:12:01       20 阅读
  12. LINUX:懒汉单例模式线程池

    2024-07-16 22:12:01       21 阅读