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 。