Symbol(ES6新增数据类型)属于基本数据类型
Symbol值由Symbol函数生成,由Symbol生成的属性名是独一无二的,不会与其他属性名冲突
Symbol函数不能使用new命令,会报错
Symbol是原始类型的值,不是对象类型,因为不是对象类型,所以不能添加属性,类似于字符串的类型。
Symbol的目的就是当作对象的属性标识符来使用
Symbol不支持隐式转换字符串
let s = Symbol();
console.log(typeof (s));//symbol
let obj3 = Symbol("2021");
let obj4 = Symbol("2021");
console.log(obj3===obj4);//false
Symbol不能与其他类型的值进行运算
let abc = Symbol('this is num');
console.log(abc + "Symbol");//TypeError: can't convert symbol to string
Symbol转换字符串
let s = Symbol('this_symbol');
console.log(String(s)); //'Symbol(this_symbol)'
console.log(toString(s)); //[object Undefined]
console.log(s.toString()); //'Symbol(this_symbol)'
能转换为布尔值,但是不能转换为数字
let s = Symbol();
console.log(Boolean(s)); //true
console.log(!s); //false
console.log(Number(s)); //Uncaught TypeError: Cannot convert a Symbol value to a number
Symbol.for()
如果要重新使用同一个 Symbol 值,可以使用Symbol.for(),接受一个字符串作为参数,然后搜索有没有以该参数作为名称的 Symbol 值。如果有,就返回这个 Symbol 值,如果没有就新建并返回一个以该字符串为名称的 Symbol 值。
Symbol.for()不会每次调用就返回一个新的 Symbol 类型的值。它会登记在全局环境中进行搜索。
Symbol会在每次调用时返回一个新的值。
let s1 = Symbol.for('aaa');
let s2 = Symbol.for('aaa');
s1 === s2 // true
//s1和s2都是 Symbol 值,它们都以同样参数的Symbol.for()方法生成的,所以实际上是同一个值
//Symbol()没有登记机制,所以每次调用都会返回一个不同的值。
let obj1 = Symbol('obj1');
let obj2 = Symbol('obj2');
console.log(obj1 == obj2);//false
Symbol.keyFor(obj1) // undefined
//变量obj1属于未登记的 Symbol 值,所以返回undefined
Reflect.ownKeys()
返回所有类型的键名,包括常规键名和Symbol键名。
let obj = {
[Symbol('name')]: 1,
num_one: 2,
num_two: 3
};
console.log(Reflect.ownKeys(obj));// ['num_one', 'num_two', Symbol(name)]
Object.getOwnPropertySymbols()
获取指定对象的所有Symbol属性名:
当前对象的所有用作属性名Symbol值以数组的形式被该方法返回
const obj = {};
let a = Symbol('a');
let b = Symbol('b');
obj[a] = 'red';
obj[b] = 'blue';
console.log(obj); //{Symbol(a): 'red', Symbol(b): 'blue'}
console.log(Object.getOwnPropertySymbols(obj)); //[Symbol(a), Symbol(b)]