什么是Symbol
ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值。
JavaScript 语言的七种数据类型:undefined、null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)、Symbol。
作用:Symbol 值通过Symbol函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol 类型。凡是属性名属于 Symbol 类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。
let symbol = Symbol();
console.log(typeof symbol);;// symbol
1.Symbol函数前不能使用new命令,否则会报错。
let symbol = new Symbol();
//Uncaught TypeError: Symbol is not a constructor
2.Symbol函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分。
let symbol1 = Symbol('Rattenking');
let symbol2 = Symbol('Stone');
//控制台输出红色
console.log(symbol1);//Symbol(Rattenking)
console.log(symbol2);//Symbol(Stone)
//控制台输出黑色
console.log(symbol1.toString());//Symbol(Rattenking)
console.log(symbol2.toString());//Symbol(Stone)
3.Symbol 的参数是一个对象,就会调用该对象的toString方法,将其转为字符串,然后才生成一个 Symbol 值。
let obj = {'a':'Rattenking'};
let sym = Symbol(obj);
console.log(sym);//Symbol([object Object])
//在对象中定义一个toString方法,调用该对象的toString的方法就会执行内部的toString方法
let obj1 = {
toString() {
return 'abc';
}
};
let sym1 = Symbol(obj1);
console.log(sym1);// Symbol(abc)
4.Symbol函数的参数只是表示对当前 Symbol 值的描述,因此相同参数的Symbol函数的返回值是不相等的。
let sym1 = Symbol();
let sym2 = Symbol();
console.log(sym1);//Symbol()
console.log(sym2);//Symbol()
sym1 === sym2//false
let sym1 = Symbol('Rattenking');
let sym2 = Symbol('Rattenking');
console.log(sym1);//Symbol('Rattenking')
console.log(sym2);//Symbol('Rattenking')
sym1 === sym2//false
5.Symbol 值不能与其他类型的值进行运算,会报错。
let sm = Symbol();
console.log(sm + 'Rattenking');
//Uncaught TypeError: Cannot convert a Symbol value to a string
6.Symbol 值也可以转为布尔值,但是不能转为数值。
let sm = Symbol();
console.log(Boolean(sm));//true
if(sm){console.log('sm is true');}//sm is true
console.log(sm + 1);
//VM328:5 Uncaught TypeError: Cannot convert a Symbol value to a number
总结:
- Symbol函数前不能使用new命令,否则会报错。
- Symbol函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分。—-参数为字符串
- Symbol 的参数是一个对象,就会调用该对象的toString方法,将其转为字符串,然后才生成一个 Symbol 值。—-如参数不是字符串会调用对象的toString方法
- Symbol函数的参数只是表示对当前 Symbol 值的描述,因此相同参数的Symbol函数的返回值是不相等的。—-每一个Symbol 都是独一无二的
- Symbol 值不能与其他类型的值进行运算,会报错。—-不能进行运算
- Symbol 值也可以转为布尔值,但是不能转为数值。—-可转布尔,不能转数字