ES6 Symbol

2019-05-08  本文已影响0人  Mr君

基本内容

let symbol1 = Symbol();
let symbol2 = Symbol();
 
// 因为每个 Symbol 值都是唯一的,因此该值不与其它任何值相等。
console.log( symbol1 === symbol2 );  // false

console.log( typeof symbol1 ); //  "symbol"

var s1 = Symbol("foo");
var s2 = Symbol("foo");

console.log( s1 === s2 ) // false
let uid = Symbol.for('uid')
let desc = uid + ""//报错 Uncaught TypeError: Cannot convert a Symbol value to a string

let uid = Symbol.for('uid')
let desc = uid / 1//报错  Uncaught TypeError: Cannot convert a Symbol value to a number
  1. 采用如下方式强制转换
let uid = Symbol.for('uid')
let desc = String(uid)
console.log(desc)//Symbol(uid)
let yellow = Symbol("Yellow");
let yellow1 = Symbol.for("Yellow");
yellow === yellow1;      // false
 
let yellow2 = Symbol.for("Yellow");
yellow1 === yellow2;     // true
let yellow1 = Symbol.for("Yellow");
Symbol.keyFor(yellow1);    // "Yellow"

应用场景

let obj = {
   [Symbol('name')]: 'name',
   age: 18,
   title: 'Engineer'
}

Object.keys(obj)   // ['age', 'title']

for (let p in obj) {
   console.log(p)   // 分别会输出:'age' 和 'title'
}

Object.getOwnPropertyNames(obj)   // ['age', 'title']

JSON.stringify(obj)  // {"age":18,"title":"Engineer"}

我们可以利用这一特点来更好的设计我们的数据对象,让“对内操作”和“对外选择性输出”变得更加优雅。
获取Symbol方式定义的对象属性:

// 使用Object的API
Object.getOwnPropertySymbols(obj) // [Symbol(name)]

// 使用新增的反射API
Reflect.ownKeys(obj) // [Symbol(name), 'age', 'title']
上一篇 下一篇

猜你喜欢

热点阅读