ECMAScript 6 新增数据类型符号对象(Symbol)-符号对象简介

 2015年11月09日    49     声明


ECMAScript 6之前,对象中的方法和属性都是字符串形式,如果有同名的方法或属性就会被覆盖。为了解决这一问题,ES6中新增了Symbol类型,用Symbol类型创建的标识符都是独一无二的。

  1. 符号对象:Symbol
  2. 关于对象类型
  3. 符号做为对象属性名


1. 符号对象:Symbol

Symbol([description])

符号是一种特殊的、不可变的数据类型,它可以作为对象属性的标识符使用。符号对象是一个对的符号原始数据类型的隐式对象包装器。

参数

description,一个可选的字符串描述。这个描述值一般用于调试而不是访问符号本身。

符号对象是JavaScript中继:BooleanNullUndefinedStringNumberObject之后,第七种数据类型。创建一个符号类型使用Symbol()函数:

var sym = Symbol();

console.log(typeof sym);  //symbol


2. 关于符号对象

创建一个新的原始符号,可以使用Symbol()和一个可选字符串参数作为它的描述:

var sym1 = Symbol();
var sym2 = Symbol("foo");
var sym3 = Symbol("foo");

上面的代码创建三个新的符号。注意,符号类型的描述“foo”唯一的作用就是在调试时,我们可以更好的区分所创始的符号。即使描述值一样,也不是同一个符号,符号类型每次都会创建一个新的符号:

console.log(Symbol("foo") === Symbol("foo"));  //false
console.log(Symbol("itbilu.com") == Symbol("itbilu.com"));  //false

创建符号类型时,不能使用new关键字:

var sym = new Symbol(); // TypeError


3. 符号做为对象属性名

由于每一个Symbol对象的值都是不相等的,利用这一特性,符号做为标识符使用。将其用于对象属性名时,可以保证对象每一个属性名都是唯一的,不会发生对象属性被覆盖的情况。

符号做为对象属性名时,不能用.的形式添加对象属性:

var sym = Symbol();
var a = {};

a.sym = 'itbilu.com';
a[sym] // undefined
a['sym'] // "itbilu.com"  以点的形式添加属性名其本质上还是一个字符串

可以使用以下三种方式添加符号的对象属性:

var sym = Symbol();

// 1. 用方括号添回
var a = {};
a[sym] = 'itbilu.com';

// 2. 在对象内部定义
var a = {
  [sym]: 'itbilu.com'
};

// 3. 用defineProperty添加
var a = {};
Object.defineProperty(a, sym, { value: 'itbilu.com' });