ES6入门之Symbol

ES5对象属性名都是字符串容易形成属性名的冲突。java

eg:var a = { name: 'lucy'};

a.name = 'lili';
这样就会重写属性

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

从新复习下新知识:基本数据类型有6种:Undefined、Null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)。spa

这里新添加了一种:Symbolcode

注意,Symbol函数前不能使用new命令,不然会报错。这是由于生成的Symbol是一个原始类型的值,不是对象对象

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

复制代码
// 没有参数的状况
var s1 = Symbol();
var s2 = Symbol();

s1 === s2 // false

// 有参数的状况
var s1 = Symbol("foo");
var s2 = Symbol("foo");

s1 === s2 // false
复制代码

Symbol值不能与其余类型的值进行运算继承

做为属性名的Symbol

复制代码
var mySymbol = Symbol();

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

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

// 第三种写法
var a = {};
Object.defineProperty(a, mySymbol, { value: 'Hello!' });

// 以上写法都获得一样结果
a[mySymbol] // "Hello!"
复制代码

注意,Symbol值做为对象属性名时,不能用点运算符。字符串

var a = {};
var name = Symbol();
a.name = 'lili';
a[name] = 'lucy';
console.log(a.name,a[name]);             //lili,lucy

Symbol值做为属性名时,该属性仍是公开属性,不是私有属性。get

这个有点相似于java中的protected属性(protected和private的区别:在类的外部都是不能够访问的,在类内的子类能够继承protected不能够继承private)it

可是这里的Symbol在类外部也是能够访问的,只是不会出如今for...infor...of循环中,也不会被Object.keys()Object.getOwnPropertyNames()返回。但有一个Object.getOwnPropertySymbols方法,能够获取指定对象的全部Symbol属性名

Symbol.for(),Symbol.keyFor()

Symbol.for机制有点相似于单例模式,首先在全局中搜索有没有以该参数做为名称的Symbol值,若是有,就返回这个Symbol值,不然就新建并返回一个以该字符串为名称的Symbol值。和直接的Symbol就点不一样了。

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

s1 === s2 // true

Symbol.keyFor方法返回一个已登记的Symbol类型值的key。实质就是检测该Symbol是否已建立

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

var s2 = Symbol("foo");
Symbol.keyFor(s2) // undefined
相关文章
相关标签/搜索