第三章----------符号(Symbol)

符号诞生原因:
ES6新增了for/of循环和可迭代对象,为此就需要定义一种标准的机制让类可以实现,从而把自身变得可迭代。但选择任何特定的字符串作为这个迭代器方法的名字都有可能破坏已有的代码。为此,符号名应运而生。
1. 符号(Symbol)是ES6新增的一种原始类型,用作非字符串的属性名。
2. 基础类型Object是一个属性的无序集合,其中每个属性都有一个名字和一个值。属性名通常是字符串。
let strname = "string name";//可以用作属性名的字符串
let symname = Symbol("propname");//可以用作属性名的符号
typeof strname//"string":strname是字符串
typeof symname //"symname"是符号
let o = {};//创建一个新对象
o[strname]=1;//使用字符串名定义一个属性
o[symname]=2;//使用符号名定义一个属性
o[strname];//1:访问字符串名字的属性
o[symname];//2: 访问符号名字的属性

3. Symbol类型没有字面量语法。要获取一个Symbol值,需要调用Symbol()函数。

这个函数永远不会返回相同的值,即使每次传入的参数都一样。

可以将调用Symbol()取得的符号值,安全地用于为对象添加新属性,而无须担心可能重写已有的同名属性。类似地,如果定义了符号属性但没有共享相关符号,也可以确信程序中的其他代码不会意外重写这个属性。

4. 符号通常用作一种语言扩展机制。
Symbol.iterator是一个符号值,可用作一个方法名,让对象变得可迭代。
Symbol()函数可选地接收一个字符串参数,返回唯一的符号值。
如果提供了字符串参数,那么调用返回符号值的toString()方法得到的结果中会包含该字符串。
不过要注意,以相同的字符串调用两次Symbol()会产生两个完全不同的符号值。
let s = Symbol("sym_x");
s.toString()//"Symbol(sym_x)"

符号值唯一有趣的方法就是toString()。不过,还应该知道两个与符号相关的函数。在使用符号时,我们有时希望它们对代码是私有的,从而可以确保你的代码的属性永远不会与其他代码的属性发生冲突。但有时我们也希望定义一些可以与其他代码共享的符号值。

例如,我们定义了某种扩展,希望别人的代码也可以使用,就像前面提到的Symbol.iterator机制一样。为了定义一些可以与其他代码共享的符号值,JavaScript定义了一个全局符号注册表。
Symbol.for()函数接收一个字符串参数,返回一个与该字符串关联的符号值。如果没有符号与该字符串关联,则会创建并返回一个新符号;否则,就会返回已有的符号。
Symbol.for()与Symbol()完全不同:
Symbol()永远不会返回相同的值,而在以相同的字符串调用时Symbol.for()始终返回相同的值。
传给Symbol.for()的字符串会出现在toString()(返回符号值)的输出中。而且,这个字符串也可以通过将返回的符号传给Symbol.keyFor()来得到。
  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值