JS的symbol数据类型
1.什么是symbol
Symbol是ES6中新增的一种数据类型, 被划分到了基本数据类型中
2.Symbol的作用
用来表示一个独一无二的值
let xxx=Symbol(‘标识字符串’);
3.为什么需要Symbol?
为了避免第三方框架的同名属性被覆盖
在企业开发中如果需要对一些第三方的插件、框架进行自定义的时候
可能会因为添加了同名的属性或者方法, 将框架中原有的属性或者方法覆盖掉
为了避免这种情况的发生, 框架的作者或者我们就可以使用Symbol作为属性或者方法的名称
4.如何区分Symbol?
在通过Symbol生成独一无二的值时可以设置一个标记
这个标记仅仅用于区分, 没有其它任何含义
//后面的括号可以给symbol做上标记便于识别
let name=Symbol('name');
let obj = {
name: 'jack',
age: 18,
[name]: 'symbolname'
}
console.log(obj.name) //jack
console.log(obj[name]) //symbolname
console.log(obj)
{
age: 18,
name:'jack',
Symbol(name):'symbolname'
}
5.注意点
Symbol是基本数据类型!!!!不要加new哦
后面括号可以传入一个字符串,只是一个标记,方便我们阅读,没有任何意义
类型转化的时候不可转化为数值
不能做任何运算,但是可以调用toString方法、可以隐式转换
let name=Symbol('name');
console.log(name+111)
console.log(name+'ccc')
//全部报错
for-in循环遍历对象的时候是无法遍历出symbol的属性和方法的
let name=Symbol('name');
let obj={
[name]:'lnj',
age:12,
teacher:'wyx'
}
for(let key in obj){
console.log(key) //只能打印出age和teacher
}
//这个方法可以单独取出Symbol(name) 返回一个数组
console.log(Object.getOwnPropertySymbols(obj))
静态方法 Reflect.ownKeys() 返回一个由目标对象自身的属性键组成的数组。
Reflect.ownKeys(obj)//返回由obj的普通属性、symbol属性键组成的数组
还可以作为常量使用 使用symbol
//作为常量
const VIDEO = Symbol()
const AUDIO = Symbol()
const IMAGE = Symbol()
function play(type){
switch(type){
case VIDEO:
console.log('VIDEO')
break;
case AUDIO:
console.log('AUDIO')
break;
case IMAGE:
console.log('IMAGE')
break;
}
}
play(VIDEO)//播放视频
不使用symbol
//作为常量
const VIDEO = 1
const AUDIO = 2
const IMAGE = 2
function play(type){
switch(type){
case 1:
console.log('VIDEO')
break;
case 2:
console.log('AUDIO')
break;
case 3:
console.log('IMAGE')
break;
}
}
play(VIDEO) 或者play(1) //都可以播放视频,为了规范代码可以使用上述方法
Symbol.for(key)
方法会根据给定的键 key
,来从运行时的 symbol 注册表中找到对应的 symbol,如果找到了,则返回它,否则,新建一个与该键关联的 symbol,并放入全局 symbol 注册表中。
let name1 = Symbol.for("foo"); // 创建一个 symbol 并放入 symbol 注册表中,键为 "foo"
let name2 = Symbol.for("foo"); // 从 symbol 注册表中读取键为"foo"的 symbol
console.log(name1 === name2)