es6学习--symbol

 

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

let s = Symbol();

console.log(typeof s); // symbol

 

1.作为属性名去使用

  由于每一个 Symbol 值都是不相等的,这意味着 Symbol 值可以作为标识符,用于对象的属性名,就能保证不会出现同名的属性。

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

let mySymbol = Symbol();

//书写方式1
let a = {};
a[mySymbol] = "hello";

//书写方式2
var a = {
    [mySymbol]:"hello"
}

//书写方式3
Object.defineProperty(a,mySymbol,{value:"hello"});

 

在对象的内部,使用 Symbol 值定义属性时,Symbol 值必须放在方括号之中,如果s不放在方括号中,该属性的键名就是字符串s,而不是s所代表的那个 Symbol 值。

 

2.属性名的遍历

Symbol 作为属性名,该属性不会出现在for...infor...of循环中,

有一个Object.getOwnPropertySymbols方法,可以获取指定对象的所有 Symbol 属性名。

Object.getOwnPropertySymbols方法返回一个数组,成员是当前对象的所有用作属性名的 Symbol 值。

var a = Symbol('a');
var b = Symbol('b');
var obj = {
    [a]:"Hello",
    [b]:"world"
};

console.log(Object.getOwnPropertySymbols(obj)); //[ Symbol(a), Symbol(b) ]

 

3.Symbol.for(),Symbol.keyFor()

   我们希望重新使用同一个Symbol值,Symbol.for方法可以做到这一点。它接受一个字符串作为参数,然后搜索有没有以该参数作为名称的Symbol值。如果有,就返回这个Symbol值,否则就新建并返回一个以该字符串为名称的Symbol值。

Symbol.keyFor方法返回一个已登记的 Symbol 类型值的key

var a = Symbol.for('aaa');
var b = Symbol.for('aaa');
var obj = {
    [a]:"Hello"
};

console.log(a===b);  //true
console.log(Symbol.keyFor(a)); //aaa

 

posted @ 2017-08-29 17:07  风起了--  阅读(152)  评论(0)    收藏  举报