产生原因:
由于在es5中,对象的属性都是字符串,很容易出现属性冲突的情况。比如我们使用一个他人提供的对象,但是我们又想给这个对象添加一些属性,这个时候就很容易出现属性冲突的情况。这时,我们希望有一种机制能够创建独一无二的值,Symbol就出现了
Symbol是一种新的原始数据类型Symbol
//创建不同的值:
Symbol('string') //接受一个string参数,表示对当前Symbol值的描述。
//创建两个相同的值:
Symbol.for('string');
//返回一个已经登记的Symbol类型的key
Symbol.keyFor();
Symbol() 和 Symbol.for()的区别
Symbol.for()在创建之前,会先搜索有没有以该参数为名称的Symbol值,如果有的话,就会直接取这个值,如果没有的话,才会创建新的Symbol。Symbol在创建之前不会进行搜索,直接创建。
Symbol的特点:
- Symbol值不能与其他类型的值进行运算,否则会报错。
- Symbol值可以显示的转换为字符串和布尔值,但是不能转换为数值。
- Symbol值作为对象的属性值时,不能用点运算符,因为点运算符后面跟的是字符串,并不是Symbol值,所以在对象内使用Symbol属性时,要放在[]中
属性名的遍历:
for....in, for ....of,Object.keys(),Object.getOwnPropertyNames()都不能返回Symbol值的属性名。
//获取指定对象的所有的Symbol属性名
Object.getOwnPropertySymbols();
Reflect.ownKeys();
内置的Symbol值
Symbol.hasInstance;
Symbol.isConcatSpreadable;
Symbol.species;
Symbol.match;
Symbol.replace;
Symbol.search;
Symbol.split;
Symbol.iterator;
Symbol.toPrimitive;
Symbol.toStringTag;
Symbol.unscopables;