首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
ES6 简介
ES6 let和const
ES6 箭头函数(Arrow Functions)
ES6 解构赋值
ES6 迭代器和for-of循环
ES6 生成器(Generators)
ES6 模板字符串
ES6 数值
ES6 不定参数和默认参数
ES6 Symbols
ES6 集合
ES6 代理(Proxies)
ES6 类(Class)
ES6 子类 Subclassing
ES6 模块 Modules
ES6 async 函数
ES6 Promise 对象
ES6 Reflect
ES6 Map的介绍与API
ES6 编程风格
当前位置:
首页>>
技术小册>>
ES6入门指南
小册名称:ES6入门指南
ES6中的Symbol是一种新的基本数据类型,它可以作为对象属性的唯一标识符,用于防止属性名冲突和保护对象的属性。 --------------------- 在ES6之前,开发人员通常使用字符串作为对象属性的唯一标识符。但是,这种方式有一个问题,就是很容易发生属性名冲突。例如,假设有两个不同的代码库,它们都定义了一个名为“id”的属性。如果这两个库被同时使用,就会发生属性名冲突,导致意想不到的行为发生。 为了解决这个问题,ES6引入了Symbol,它可以用来创建唯一的属性标识符。每个Symbol实例都是唯一的,因此不会与其他属性名冲突。下面是一个创建Symbol的例子: ``` const symbol1 = Symbol(); const symbol2 = Symbol('foo'); const symbol3 = Symbol('foo'); ``` 在上面的例子中,symbol1、symbol2和symbol3都是不同的Symbol实例。symbol2和symbol3都是通过传递相同的字符串'foo'来创建的,但它们仍然是不同的Symbol实例。 另一个有趣的特性是,Symbol可以作为对象属性名,例如: ``` const obj = {}; const symbol = Symbol('key'); obj[symbol] = 'value'; console.log(obj[symbol]); // 输出"value" ``` 在上面的例子中,我们使用Symbol作为对象属性的名称。这意味着该属性对外部代码是不可见的,因为没有其他方式可以引用该Symbol实例。如果我们尝试使用obj.key来访问该属性,将会得到undefined。 此外,Symbol还可以用作一组常量的枚举,例如: ``` const Colors = { RED: Symbol('red'), GREEN: Symbol('green'), BLUE: Symbol('blue') }; ``` 在上面的例子中,我们使用Symbol来创建Colors对象的三个常量属性。这些属性的值是Symbol实例,因此它们在JavaScript中是唯一的。 使用Symbol的另一个有趣的用途是创建私有属性。由于Symbol作为属性名是不可枚举的,因此可以将其用于私有属性的命名。例如: ``` const MyClass = (function() { const privateProperty = Symbol('privateProperty'); class MyClass { constructor(value) { this[privateProperty] = value; } getPrivateProperty() { return this[privateProperty]; } } return MyClass; })(); const myObject = new MyClass('foo'); console.log(myObject.getPrivateProperty()); // 输出"foo" console.log(myObject.privateProperty); // 输出undefined ``` 在上面的例子中,我们使用Symbol创建了一个名为privateProperty的私有属性。该属性是通过构造函数中的this[privateProperty]来创建的,这意味着它是一个实例属性,而不是一个原型属性。此外,我们还定义了一个getPrivateProperty()方法来获取私有属性的值。由于privateProperty是Symbol类型的属性,因此它在类的外部是不可见的。 Symbol还有一些内置的静态属性和方法。其中一些属性和方法如下: - Symbol.iterator:表示一个对象是可迭代的,即可以使用for...of循环进行遍历。 - Symbol.toPrimitive:将对象转换为原始值的方法。当对象被用于算术运算时,JavaScript会自动调用该方法来将对象转换为数字。 - Symbol.hasInstance:用于确定对象是否为构造函数的实例。 - Symbol.match、Symbol.replace、Symbol.search和Symbol.split:这些属性是RegExp对象的内置Symbol属性,用于覆盖正则表达式的默认行为。 使用Symbol还有一些需要注意的地方。例如,由于Symbol是唯一的,因此两个Symbol实例之间无法进行相等比较。但是,ES6提供了另外一个内置对象WeakMap,可以用来存储Symbol与其对应的值。这意味着我们可以使用WeakMap来存储对象的私有属性,并在需要时访问它们。 另一个需要注意的地方是,由于Symbol作为属性名是不可枚举的,因此它们无法通过for...in循环进行遍历。但是,可以使用Object.getOwnPropertySymbols()方法来获取对象上所有的Symbol属性,例如: ``` const obj = { [Symbol('foo')]: 'foo value', [Symbol('bar')]: 'bar value' }; const symbols = Object.getOwnPropertySymbols(obj); console.log(symbols); // 输出[Symbol(foo), Symbol(bar)] console.log(obj[symbols[0]]); // 输出"foo value" ``` 在上面的例子中,我们使用Object.getOwnPropertySymbols()方法获取了对象obj上的所有Symbol属性,并使用第一个Symbol属性的值来访问它对应的属性。 Symbol是一种新的基本数据类型,它可以用于创建唯一的属性标识符,并可以用于创建私有属性、常量枚举等。Symbol还有一些内置的静态属性和方法,可以扩展JavaScript的功能。
上一篇:
ES6 箭头函数(Arrow Functions)
下一篇:
ES6 集合
该分类下的相关小册推荐:
JavaScript入门与进阶
KnockoutJS入门指南
Node.js 开发实战
Javascript重点难点实例精讲(一)
Flutter核心技术与实战
编程入门课:Javascript从入门到实战
深入学习前端重构知识体系
剑指javascript-ES6
经典设计模式Javascript版
Javascript编程指南
javascript设计模式原理与实战
JavaScript面试指南