Symbol

26 篇文章 1 订阅

前言:Symbol是ES新加入的一种数据类型,属于原始数据类型。symbol表示独一无二的值。

1、创建symbol

//通过Symbol函数来创建一个symbol对象
let s = Symbol()

//可以传入一个字符串参数来描述当前symbol对象
let s2 = Symbol('hello')

typeof s  // symbol

2、symbol不能与任何类型进行运算,否则报错,symbol可以转换成字符串,或者boolean类型

let s = Symbol('hello')

String(s)  // 'Symbol("hello")'
s.toString() // 'Symbol("hello")'

Boolean(s) // true

if(s) {}  // true

3、使用symbol作为对象属性的key,ES5中,对象属性的都是字符串,这就导致,有时候我们需要给某个对象拓展属性,可能会造成命名冲突,覆盖原来的属性值,使用symbol可以解决这个问题,因为symbol是独一无二的。

let s = Symbol('foo')
const obj = {
    s:"tom"
}
obj[s] = "张三"

obj.s  //tom
obj[s] //张三

注意:symbol作为对象属性不能通过属性访问器来访问和设置,只能通过[s]来访问。而且symbol作为对象属性键,不能没枚举,也就是不能被for  in和for of 命中。也不能被Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回。

4、消除魔术字符,魔术字符串指的是,在代码之中多次出现、与代码形成强耦合的某一个具体的字符串或者数值。我们可以将这个字符串声明为一个变量,变量值为一个symbol对象

5、单例模式中的应用

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];

6、Symbol.for()与Symbol.keyFor()

有时,我们希望重新使用同一个 Symbol 值,Symbol.for方法可以做到这一点。它接受一个字符串作为参数,然后搜索有没有以该参数作为名称的 Symbol 值。如果有,就返回这个 Symbol 值,否则就新建并返回一个以该字符串为名称的 Symbol 值。

let s1 = Symbol.for('foo');
let s2 = Symbol.for('foo');

s1 === s2 // true

Symbol.keyFor方法返回一个已登记的 Symbol 类型值的key

let s1 = Symbol.for("foo");
Symbol.keyFor(s1) // "foo"

let s2 = Symbol("foo");
Symbol.keyFor(s2) // undefined

参考:ES6

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值