基本数据类型Symbol

发布时间 2023-06-25 11:29:58作者: 九折丶水平

参考https://blog.csdn.net/darabiuz/article/details/121962153

Symbol的方法

Symbol()每次被调用都会生成一个新的Symbol,写法没有登记机制,所以每次调用都会返回一个不同的值

Symbol.for()不会每次调用就返回一个新的Symbol,而是会先检查给定的key是否已经存在,如果不存在,则会在全局创建并注册这个key,然后才会新建一个Symbol值

Symbol.keyFor()方法返回一个已经登记的Symbol类型值的key

// Symbol()
let s1 = Symbol('s')
let S2 = Symbol('s')
console.log(s1)//Symbol(s)
console.log(s2)//Symbol(s)
console.log(s1 === s2)//false

//Symbol.for()
let s1 = Symbol.for('s')
let s2 = Symbol.for('s')
console.log(s1)//Symbol(s)
console.log(s2)//Symbol(s)
console.log(s1 === s2)//true

//Symbol.keyFor()
let s1 = Symbol('s')
let s2 = Symbol.for('s')
Symbol.keyFor(s1)//undefined
Symbol.keyFor(s2)//s

作用

1、避免重复命名问题
2、消除魔术字符串(代码中多次出现,与代码形成强耦合的某一字符串或数值)
3、为对象定义一些非私有的、但又希望只用于内部的方法。

1、避免重复命名问题

定义Symbol类型的变量时,由于Symbol是唯一的所以可以避免重复命名

Symbol()的参数只是表示对于当前Symbol值得描述,因此相同参数的Symbol的返回值是不相等的

let s1 = Symbol('foo')
let S2 = Symbol('foo')
console.log(s1)//Symbol(foo)
console.log(s2)//Symbol(foo)
console.log(s1 === s2)//false

2、消除魔术字符串

个人理解

//平时
function test(val){
    if(val == 'tmd'){
       console.log("我是业务逻辑")
     }
}
test('tmd')//我是业务逻辑


//Symbol(错误示范)
function test(val){
    if(val == Symbol('tmd')){
       console.log("我是业务逻辑")
     }
}
test(Symbol('tmd'))//undefined 


//Symbol(正确示例,消除魔法字符串)
let temp = Symbol('tmd')
function test(val){
    if(val == temp){
       console.log("我是业务逻辑")
     }
}
test(temp)//我是业务逻辑

3、为对象定义一些非私有的、但又希望只用于内部的方法。

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))