es6新标,加入了新的数据类型Symbol与新的数据结构set、map,他们各有特点。●Symbol:
let a=Symbol();
console.log(typeof a);//symbol,js语言的数据类型再添一员
Symbol()==Symbol();//false
let a=Symbol();
let b=Symbol();
a==b;//false,symbol数据的特性,每个symbol数据都是独一无二的值,在对象增加属性的时候,可以避免名字重复的困扰
let a=Symbol();
let b=Symbol();
console.log(a);//Symbol()
console.log(b);//Symbol(),a与b虽然不相等,但是打印出的数据却是一样的,为了区分他们,可以传参:
let c=Symbol('ccc');//Symbol(ccc),传入的参数仅做标记,没有任何实际意义
let a=Symbol();
a+'ccc';//报错
a+2;//报错,symbol类型的数据不能与其他类型的数据进行运算
let a=Symbol('aaa');
String(a);//'Symbol(aaa)'
Boolean(a);//true
Number(a);//报错,symbol类型的数据可以转为string与boolean类型,但是不能转换为number类型
let a=Symbol();
let obj1={a:'aaa'};//结果{a:'aaa'},此时的obj的属性是a
let obj2={[a]:'aaa'};//{Symbol(): "aaa"},此时obj的属性则是Symbol();
console.log(obj2[a]);//aaa,取值时候,属性名依然是a
新的数据类型symbol,最大的特点首当唯一性了,symbol不能隐式的转换类型,所以和其他数类型数据做运算时会报错。但是,symbol可以显式地转为字符串和布尔类型。对象object,在添加symbol类型属性时,必须用[]外扩symbol,不能用点式法对其进行操作。如同其他类型数据一般,symbol也有一些内置方法,,,
let a=Symbol.for('my');
let b=Symbol.for('my');
a==b;//true,到此处,看似已经与上面相抵触,其实不然Symbol(my)仅产生了一个symbol数据,a和b都是同一个值,下面可看例子:
let ab=Symbol();
let a=ab;
let b=ab;
a==b;//true,这里便是上例子的解释
let a=Symbol('my');
let b=Symbol.for('my');
Symbol.keyfor(a);//undefined
Symbol.keyfor(b);//my
///Symbol.keyfor()方法接收一个Symbol.for()产生的数据,返回其对应描述(标记),由于a直接由Symbol()产生,故未能识别
let arr1=[1,2,3];
let arr2=['a','b'];
arr1[Symbol.isConcatSpreadable]=false;
arr1.concat(arr2);//[[1,2,3],a,b]
arr1[Symbol.isConcatSpreadable]=true;
arr1.concat(arr2);//[1,2,3,a,b]
[Symbol.isConcatSpreadable]表示concat进行拼接时候,是否展开,默认true。
symbol借鉴了很多其他数据类型的方法,包括替换、分割、遍历等等…
原文:https://blog.csdn.net/Wbiokr/article/details/68124721