ggggxc学习笔记----ES6笔记IV----Symbol

本文介绍了JavaScript ES6引入的Symbol类型,如何生成独一无二的值,以及在对象属性名、单例模式、消除魔术字符串和常量管理等方面的应用。了解如何利用Symbol创建不冲突的属性名和实现高级编程技巧。
摘要由CSDN通过智能技术生成

十、Symbol

介绍:ES6引入的一种新的原始数据类型Symbol,表示独一无二的值。它是 JavaScript 语言的第七种数据类型。Symbol 值通过Symbol函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol 类型。凡是属性名属于Symbol类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。Symbol函数可以接受参数表示对于这个唯一值的描述。

例:

let s = Symbol()
typeof s ;
//"'symbol'

其中变量s表示独一无二的值。

在这里需要注意:Symbol函数前不能使用new命令,否则会报错。因为Symbol的值不是对象,所以不能添加属性。

应用:

       由于每一个Symbol值都是不相等的,这意味着Symbol值可以作为标识符,用于对象的属性名,就能保证不会出现同名的属性。这对于一个对象由多个模块构成的情况非常有用,能防止某一个键被不小心改写或覆盖。

例:

let s = Symbol();
var obj={};
obj[s] =”hello world” ;
console.log(obj[s]);

消除魔术字符串,其做法类似于Java中的静态常量:

const shapeType = {triangle: Symbol() }; shapeType.triangle

单例模式,调用一个类,任何时候返回的都是同一个实例:

const FOO_KEY = Symbol.for('foo');
function A() { this.foo = 'hello'; }
if (!global[FOO_KEY]) { global[FOO_KEY] = new A(); }
module.exports = global[FOO_KEY];

例子:

let sy1 = Symbol('sy1');
let sy2 = Symbol('sy2');
console.log(sy1, sy2);
console.log(sy1 == sy2);
//这里的sy1和sy2是两个Symbol值,如果不加参数,它们在控制台的输出都是Symbol(),不利于区分。有了参数以后,就等于为它们加上了描述,输出的时候就能够分清两个值。


// API
// .for会到全局注册表中查找,是否有'sy3'这个对应的key值,
// 如果有,将该key值对应的symbol值返回,
// 如果没有,就新建一个symbol值
let sy3 = Symbol.for('hello');
let sy4 = Symbol.for('sy3');
console.log(sy3, sy4);
console.log(sy3 == sy4);

// .keyFor
let key = Symbol.keyFor(sy3);
console.log(key);

// 应用 => 对象的属性名也可以指定为一个Symbol值
let obj = {
  [sy2]: 'nihao'
}
obj[sy1] = 'hello world'
console.log(obj);

 

注意:在对象的内部,使用 Symbol 值定义属性时,Symbol 值必须放在方括号之中。

如果不放在方括号中,该属性的键名就是字符串,而不是之前所代表的那个 Symbol 值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gaoxiaochan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值