Symbol

Symbol

概述

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

Symbol 值通过Symbol函数生成,可以加上参数,表示对实例的描述。

let s = Symbol();
let s1 = Symbol('foo');

console.log(s);
console.log(s1);
//Symbol()
//Symbol(ew)

typeof s
typeof s1
// "symbol"
// "symbol"

Symbol函数不能使用new命令,这是一种数据类型,不是对象。

如果Symbol参数是一个对象,就会调用toString方法。

let obj1={a:'aa'}
let obj2={a:'aa',toString:function(){console.log("hei")}}

let sym=Symbol(obj);
let sym1=Symbol(obj1);

//hei

Symbol不能与其他数据类型运行,可以转换成字符串以及布尔值。

var sym = Symbol('My symbol');

String(sym) // 'Symbol(My symbol)'
sym.toString() // 'Symbol(My symbol)'
Boolean(sym) //true

作为属性名的Symbol

每个Symbol值都是不相等的,作为对象属性名不会给覆盖,但不能用点运算。

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

a.mySymbol = 'Hello!';
a[mySymbol] // undefined
a['mySymbol'] // "Hello!"

属性名遍历

对象的Symbol属性只能通过Object.getOwnPropertySymbols方法获得。

var obj = {};
var a = Symbol('a');
var b = Symbol('b');

obj[a] = 'Hello';
obj[b] = 'World';

var objectSymbols = Object.getOwnPropertySymbols(obj);

objectSymbols
// [Symbol(a), Symbol(b)]

一个新的API,Reflect.ownKeys方法可以返回所有类型的键名,包括常规键名和 Symbol 键名。

let obj = {
  enum: 2,
  nonEnum: 3
};

Reflect.ownKeys(obj)
//  ["enum", "nonEnum", Symbol(my_key)]

Symbol.for(),Symbol.keyFor()

Symbol.for()方法会搜索有没有这个参数作为名称的Symbol值,有就返回,没有就新建。

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

s1 === s2 // true
s1
//Symbol(foo)
s2
//Symbol(foo)

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

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

参考:http://es6.ruanyifeng.com/#docs/symbol

Last updated