防止属性名冲突,ES5 的对象属性名都是字符串,这容易造成属性名的冲突。
Symbol跟undefined
、null
、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)同属于基本数据类型.
1.symbol的创建和验证
let a = Symbol();
console.log(typeof(a));
Symbol
typeof运算的结果显示a属于symbol类型.
2.description提取symbol的描述
let sym1 = Symbol('abc')
let sym2 = Symbol('abc')
console.log(sym1.description,sym2);
abc Symbol(abc)
3.symbol函数的参数值相等时但返回值不相等
let a = Symbol();
let b = Symbol();
console.log(a==b);
console.log(a===b);
let c = Symbol('sym');
let d = Symbol('sym');
console.log(c==d);
console.log(c===d);
false
false
false
false
4.symbol函数不能被当作构造函数使用
const a = new Symbol();
console.log(a);//报错
Symbol is not a constructor
5.Symbol 值不能与其他类型的值进行运算,会报错(Symbol值的产生主要是为了解决对象的属性名冲突问题)
let a = Symbol(10);
console.log(a+10);//报错
Cannot convert a Symbol value to a number
6.Symbol值具有toString方法的,但undefined不能toString,因为undefined不具有包装对象.
let s8 = Symbol()
let s9 = Symbol('abcd');
console.log(s8.toString(), s9.toString());
Symbol() Symbol(abcd)
7.可以用Symbol.for方法创建同一个symbol
const a = Symbol.for('hi'), b = Symbol.for('hi');
console.log(a == b,a === b);
true true