ES6---新增数据类型Symbol

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 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值