乐趣区

关于前端:ES6入门之Symbol

ES5 对象属性名都是字符串容易造成属性名的抵触。

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

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

ES6 引入了一种新的原始数据类型 Symbol,示意举世无双的值。

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

这里新增加了一种:Symbol

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

Symbol函数能够承受一个字符串作为参数,示意对 Symbol 实例的形容,次要是为了在控制台显示,或者转为字符串时,比拟容易辨别。

// 没有参数的状况
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 值作为属性名时,该属性还是公开属性,不是公有属性。

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

然而这里的 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</pre>

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

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

var s2 = Symbol("foo");
Symbol.keyFor(s2) // undefined</pre>
退出移动版