什么是 Symbol ?
Symbol,表示独一无二的值,是 js 中第七种数据类型
基本数据类型
Null Undefined Number Boolean String Symbol
引用数据类型
Object
let s1 = Symbol();
let s2 = Symbol();
console.log(typeof s1); // symbol
console.log(s1 === s2); // false
注意:Symbol 函数前不能使用 new 否则会报错,原因在于 Symbol 是一个原始类型的值,不是对象。
let s3 = new Symbol(); // Symbol is not a constructor
Symbol 函数接收一个字符串作为参数,表示对 Symbol 的描述,主要是为了在控制台显示,或者转为字符串的时候便于区分。
let s3 = Symbol('hello');
let s4 = Symbol('world');
console.log(s3, s4); // hello world
console.log(Symbol('hello') === Symbol('hello')); // false
// 'hello'仅仅是对 Symbol 的一个描述没有具体意义
Symbol 数据类型转换
console.log(String(Symbol('hello'))); // Symbol(hello)
console.log(Symbol('hello').toString()); // Symbol(hello)
console.log(!!Symbol()); // true
console.log(Number(Symbol())); // Cannot convert a Symbol value to a number 不能转为数字
console.log(Symbol('hello') + 'world'); // Cannot convert a Symbol value to String 不能拼接字符串
console.log(Symbol('hello') * 100); // 不能做任何运算
作为对象属性名
let aaa = Symbol('aaa');
const obj = {
};
obj[aaa] = 'hello';
console.log(obj);
console.log(obj[aaa]); // hello
let bbb = Symbol('bbb');
const data = {
[bbb]:'hello'
};
consloe.log(data);
console.log(data[bbb]); // hello
不能被 for in 循环遍历,但是也不是私有属性,可以通过 Object.getOwnPropertySymbol 方法获得一个对象的所有的 Symbol 属性
const data = {
[Symbol()]: 123,
a:1,
b:2
};
for (let i in data){
console.log(i);
}
console.log(Object.getOwnPropertySymbol(data)); // [Symbol()]
console.log(data[Object.getOwnPropertySymbol(data)[0]]); // 123