打赏

ES6 Symbol

1、symbol

ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值。js的第七种类型。

let s = Symbol();

typeof s//symbol

注意,Symbol函数前不能使用new命令,否则会报错。这是因为生成的 Symbol 是一个原始类型的值,不是对象。也就是说,由于 Symbol 值不是对象,所以不能添加属性。基本上,它是一种类似于字符串的数据类型。

Symbol函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分。

切记:不能使用new创建symbol

2、作为属性名的 Symbol

对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol 类型。由于每一个 Symbol 值都是不相等的,这意味着 Symbol 值可以作为标识符,用于对象的属性名,就能保证不会出现同名的属性。

let mySymbol = Symbol();

// 第一种写法
let a = {};
a[mySymbol] = 'Hello!';

// 第二种写法
let a = {
  [mySymbol]: 'Hello!'
};

注意,Symbol 值作为对象属性名时,不能用点运算符。因为点运算符后面总是字符串。必须使用方括号访问这些属性

属性的名字是symbol而不是一个字符串。除此之外,它与一个普通的属性没有什么区别

 

用法:

const COLOR_RED    = Symbol();
const COLOR_GREEN  = Symbol();

function getComplement(color) {
  switch (color) {
    case COLOR_RED:
      return COLOR_GREEN;
    case COLOR_GREEN:
      return COLOR_RED;
    default:
      throw new Error('Undefined color');
    }
}

常量使用 Symbol 值最大的好处,就是其他任何值都不可能有相同的值了。

3、Symbol.for

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

s1 === s2 // true

Symbol.for()Symbol()这两种写法,都会生成新的 Symbol。它们的区别是,前者会被登记在全局环境中供搜索,后者不会。Symbol.for()不会每次调用就返回一个新的 Symbol 类型的值,而是会先检查给定的key是否已经存在,如果不存在才会新建一个值。比如,如果你调用Symbol.for("cat")30 次,每次都会返回同一个 Symbol 值,但是调用Symbol("cat")30 次,会返回 30 个不同的 Symbol 值。

Symbol.for("bar") === Symbol.for("bar")
// true

Symbol("bar") === Symbol("bar")
// false

 4、使用示例

const name=Symbol('name')
let aa={
    [name]:'mfg',
    show(){
        console.log(this[name])
    }
}
aa.show();

控制台输出:‘mfg’

 

 

总结: 使用场景就是防止变量被覆盖,尤其是对象的key被覆盖,所以可以使用Symbol定义对象的key值。

posted @ 2018-01-16 14:26  孟繁贵  阅读(174)  评论(0编辑  收藏  举报
TOP