ES6的Symbol

325 阅读2分钟

ES5中有6种数据类型,包括5种基本数据类型(Number,String,Boolean,Null,Undefined)和1种复杂数据类型(Object), 到了ES6,新增一种数据类型Symbol类型,Symbol类型也是属于基本数据类型。 Symbol类型的的作用,是声明一个独一无二的变量。

用法

const s = Symbol();

  • Symbol()函数可以接收一个字符串作为参数,表示对Symbol实例的描述。
  • 每次创建的Symbol的值都是独一无二的。
const s1 = Symbol('name');
const s2 = Symbol('name');
console.log(s1 === s2); // false

作为属性名的Symbol

这里有几种方式,来让Symbol的值作为对象的属性名:

let name = Symbol('name');
let obj = {};

//方式一:
obj[name] = 'beijing';
console.log(obj[name]); // beijing

//方式二
 obj = {
    [name]: 'beijing'
}
console.log(obj[name]);

//方式三
Object.defineProperty(obj, name, {value: 'beijing'})
console.log(obj.name); // beijing

获取对象的Symbol属性

  • 通过普通的遍历是无法从对象中拿到Symbol属性的。
let name = Symbol('name');
let obj = {
    age: 20,
    height: 180,
    [name]: 'golden'
}

for(let key in obj){
    console.log(key,obj[key]);
}
// age 20
// height 180
  • Object.getOwnPropertyName()也无法拿到Symbol属性
let name = Symbol('name');
let obj = {
    age: 20,
    height: 180,
    [name]: 'golden'
}

let keysArr = Object.getOwnPropertyNames(obj);
console.log(keysArr); // ["age","height"]
  • 可以通过Object.getOwnPropertySymbols拿到Symbol属性
let keyArr = Object.getOwnPropertySymbols(obj);
console.log(keyArr) // [Symbol(name)]
  • Reflect.ownKeys()可以获取全部属性,包括Symbol属性
let keyArr = Reflect.ownKeys(obj);
console.log(keyArr); // ["age", "height", Symbol(name)]

Symbol.for()和Symbol.keyFor()

  • Symbol.for()用来判断是否存在以该参数作为名称的Symbol值,如果有,就返回这个Symbol值,否则就新建并返回一个以该参数为名称的Symbol值。和直接创建Symbol有点不同。
  • 个人理解:Symbol.for() 用来判断之前有没有使用Symbol.for()这个函数创建过以相同参数的值,如果有,则返回这个创建过的值,如果没有,则以Symbol.for()这个函数重新去创建带有参数的值。
let s1 = Symbol.for('name'); // 这里没有找到以name作为参数的的值,则创建一个,调用Symbol.for('name')
let s2 = Symbol.for('name'); // 上一步骤已经创建了一个以name作为参数的值,在这里直接返回那个值s1
console.log(s1 === s2); // true
  • Symbol.keyFor(),返回一个以Symbol.for()创建的值的key
let s1 = Symbol.for('name');
let s2 = Symbol('age');
let key1 = Symbol.keyFor(s1);
let key2 = Symbol.keyFor(s2);
console.log(key1,key2); // name,undefined

s1是以Symbol.for()方式创建的,s2是以Symbol()方式创建的,所以Symbol.keyFor(s2)返回undefined 。