ES6 symbol

为什么需要Symbol

ES5里面对象的属性名都是字符串,如果你需要使用一个别人提供的对象,你对这个对象有哪些属性也不是很清楚,但又想为这个对象新增一些属性,那么你新增的属性名就很可能和原来的属性名发送冲突,显然我们是不希望这种情况发生的。所以,我们需要确保每个属性名都是独一无二的,这样就可以防止属性名的冲突了。因此,ES6里就引入了Symbol用它来产生一个独一无二的值

Symbol是什么

Symbol实际上是ES6引入的一种原始数据类型,除了Symbol,JavaScript还有其他5种数据类型,分别是UndefinedNullBooleanStringNumber、对象,这6种数据类型都是ES5中就有的。

es6新增数据类型 Symbol(生成独一无二的数据的)
Symbol函数生成的原始数据类型不存在引用值地址的说法的也是在内存占据空间的。

怎么生成一个Symbol类型的值

既然我们已经知道了Symbol是一种原始的数据类型,那么怎么生成这种数据类型的值呢?Symbol值是通过Symbol函数生成的,如下:

let s1 = Symbol();//生成Symbol数据类型,结果是symbol()
console.log(s1);
console.log(typeof s1);//检测Symbol数据类型,结果是symbol

Symbol生成的数据是独一无二(如下)

let s1 = Symbol();
let s2 = Symbol();
console.log(s1===s2);//false
console.log(Object.is(s1,s2));//false
 //即使用Symbol生成的数据完全一样,那么也不是一个东西
 //(只要是通过Symbol这个函数生成的Symbol数据本质上就是独一无二的,即使你长的一样但是本质也
 //是不一样的)

符号的特点

  1. 符号没有字面量的写法
  2. 符号没有字面量的写法
const syb1 = Symbol();
console.log(typeof syb1); //symbol
  1. 调用Symbol函数得到的符号永远不会相等,不管符号描述是否相同
const syb1 = Symbol("ycxvip");
const syb2 = Symbol("ycxvip");
console.log(syb1 === syb2); //false
  1. 符号可以作为对象的属性名使用,这种属性名叫符号属性
const syb1 = Symbol("abc");
const obj = {
    a: 1,
    b: 2,
    [syb1]: 3,
}
console.log(obj); // {a: 1, b: 2, Symbol(abc): 3}
  1. 符号可以通过设计,让外面无法访问到
const syb1 = Symbol("abc");
const obj = {
    a: 1,
    b: 2,
    [syb1]: 3,
}
console.log(obj); // {a: 1, b: 2, Symbol(abc): 3}
  1. 符号属性不能被枚举
const syb1 = Symbol("abc");
const obj = {
    a: 1,
    b: 2,
    [syb1]: 3,
}
console.log(obj); // {a: 1, b: 2, Symbol(abc): 3}
for (let key in obj) {
    console.log(key); // a   b
}
console.log(Object.keys(obj)); // ["a", "b"]   es5获取属性名的方法获取不到符号属性
console.log(Object.getOwnPropertyNames(obj)); // ["a", "b"]   es6获取属性名的方法获取不到符号属性
console.log(Object.getOwnPropertySymbols(obj)); // [Symbol(abc)]  es6专门的获取符号属性的方法
  1. 符号类型无法被隐式转换,数字运算,字符串拼接都是不行的(但是可以进行内部的显示转换)
const syb1 = Symbol("abc");
console.log(syb1 + 123); // TypeError: Cannot convert a Symbol value to a number
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值