ES6特性:Symbol类型

ES5中有6中数据类型:undefined、null、Boolean、String、Number、Object;ES6引入了一种新的原始数据类型:Symbol,表示独一无二的值。

ES5的对象属性名都是字符串,这很容易出现属性名的冲突。如果你使用了一个别人提供的对象,现在想为这个对象添加新的方法,新方法的名字就有可能和现有方法产生冲突。如果有一种机制,保证每个属性的名字都是独一无二的,这样就从根本上防止了属性名的冲突。这也是ES6引入Symbol的原因。

创建

    Symbol值通过Symbol函数生成。即对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种是新增的Symbol类型。只要属性名是Symbol类型,它就是独一无二的,可以保证不会和其他属性名产生冲突

let name=Symbol();
typeof name    // "symbol"

    注意:Symbol函数前不能使用new命令,否则会报错。因为生成的Symbol是一个原始类型的值,不是对象。

let name=new Symbol();    // Uncaught TypeError: Symbol is not a constructor

    Symbol函数可以接受一个字符串作为参数,为新创建的Symbol提供描述,用来显示在控制台或者作为字符串的时候使用,便于区分。

let s=Symbol('str');
s    // Symbol(str)
s.toString()    // "Symbol(str)"

使用

由于每一个Symbol的值都是不相等的,所以Symbol作为对象的属性名,可以保证属性不重名

let s=Symbol("key1");

// 写法一
let o={};
o[s]="aa";
console.log(o);    // {Symbol(key1):"aa"}

// 写法二
let o={
    [s]:"aa"
};
console.log(o);    // {Symbol(key1):"aa"}

// 写法三
let o={};
Object.defineProperty(o,s,{value:"aa"});
console.log(o);    // {Symbol(key1):"aa"}

Symbol作为对象属性名时不能用 . 运算符,因为 . 运算符后面是字符串,导致获取到的属性名是字符串,而不是Symbol值;同理,在对象的内部使用Symbol值定义属性时,Symbol值必须放在方括号[ ] 中。

let o={};
let k=Symbol('key1');
o[k]="aa";
console.log(o[k]);    // aa
console.log(o.k);    // undefined

let s = Symbol();
let obj = {
  [s]: function (arg) { ... }
};

猜你喜欢

转载自blog.csdn.net/qq_41049816/article/details/88528766