首页前端开发其他前端知识Symbol类型声明方式是什么,如何使用呢?

Symbol类型声明方式是什么,如何使用呢?

时间2024-03-26 03:00:04发布访客分类其他前端知识浏览647
导读:这篇文章主要给大家介绍“Symbol类型声明方式是什么,如何使用呢?”的相关知识,下文通过实际案例向大家展示操作过程,内容简单清晰,易于学习,有这方面学习需要的朋友可以参考,希望这篇“Symbol类型声明方式是什么,如何使用呢?”文章能对大...
这篇文章主要给大家介绍“Symbol类型声明方式是什么,如何使用呢?”的相关知识,下文通过实际案例向大家展示操作过程,内容简单清晰,易于学习,有这方面学习需要的朋友可以参考,希望这篇“Symbol类型声明方式是什么,如何使用呢?”文章能对大家有所帮助。

Symbol一种新的原始数据类型,表示独一无二的。是javascript中第七种数据类型。另外六种分别是:undefined、null、String、Number、Object

声明方式

Symbol值通过Symbol函数生成。对象的属性名可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol 类型。属性名属于 Symbol 类型的,都是独一无二的,可以保证不会与其他属性名产生冲突。

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

//Symbol函数能接受字符串作为参数,表示对Symbol实例的描述
let s1=Symbol('xxx')
let s2=Symbol('hhh')
console.log(s1)
//Symbol(xxx)
console.log(s2)
//Symbol(hhh)
console.log(s1===s2)
//false复制代码

Symbol函数前不能使用new命令,会报错。这是因为生成的 Symbol 是一个原始类型的值,不是对象。也就是说,由于 Symbol 值不是对象,所以不能添加属性。相当于是一种特殊的字符串。

Symbol.for()全局定义Symbol

Symbol.for() 接受一个字符串作为参数,然后搜索有没有以该参数作为名称的 Symbol 值。如果有,就返回这个 Symbol 值,否则就新建一个以该字符串为名称的 Symbol 值,并将其注册到全局。

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


function foo(){

    return Symbol.for('hello')
}

const x=foo()
const y=Symbol.for('hello')
console.log(x === y)//true

Symbol.for()与Symbol()这两种写法,都会生成新的 Symbol。区别是,前者会被登记在全局环境中供搜索,后者就不会。Symbol.for()不会每次调用就返回一个新的 Symbol 类型的值,而是会先检查给定的key是否已经存在,不存在才会新建一个值。

Symbol.keyFor()

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

const s1 = Symbol('foo')
console.log(Symbol.keyFor(s1)) // undefined

const s2 = Symbol.for('foo')
console.log(Symbol.keyFor(s2)) // foo

应用场景

作为属性名

由于 Symbol 值都是不相等的,这意味着 Symbol 值可以作为标识符,用在对象的属性名,就能保证不会出现同名的属性。这对于一个对象由多个模块构成的情况非常有用,防止某一个键被不小心改写或覆盖。

const grade={

    张三:{
address:'qqq',tel:'111'}
,
    李四:{
address:'aaa',tel:'222'}
,
    李四:{
address:'sss',tel:'333'}
,
}

console.log(grade)
//张三: {
address: "qqq", tel: "111"}
 李四: {
address: "sss", tel: "333"}

//对象的key值不能重复 如果有重复 后面的value值就会覆盖前面的


//使用Symbol解决,相当于一个独一无二的字符串
const stu1=Symbol('李四')
const stu2=Symbol('李四')
console.log(stu1===stu2)
//false
const grade={

    [stu1]:{
address:'aaa',tel:'222'}
,
    [stu2]:{
address:'sss',tel:'333'}
,
}

console.log(grade)
//李四:{
address:'sss',tel:'222'}
 李四:{
address:'sss',tel:'333'}

console.log(grade[stu1])
//李四:{
address:'sss',tel:'222'}

console.log(grade[stu2])
//李四:{
address:'sss',tel:'333'}

属性遍历

const sym=Symbol('imooc')
class User{

    constructor(name){

        this.name=name
        this[sym]='imooc.com'
    }

    getName(){

        return this.name+this[sym]
    }

}

const user=new User('www')

//for in的方法不能遍历到Symbol属性 像被隐藏了
for(let key in user){

    console.log(key)//name 
}


//Object.keys(obj)方法也不能遍历到Symbol属性
for(let key of Object.keys(user)){

    console.log(key)//name 
}


//Object.getOwnPropertySymbols(obj)只能获取到Symbol属性
for(let key of Object.getOwnPropertySymbols(user)){

    console.log(key)//Symbol(imooc) 
}


//Reflect.ownKeys(obj)对象的属性都能获取到
for(let key of Reflect.ownKeys(user)){

    console.log(key)
    //name 
    //Symbol(imooc) 
}

消除魔术字符串

魔术字符串指的是,在代码中多次出现、与代码形成强耦合的某一个具体的字符串或者数值。风格良好的代码,应该尽量消除魔术字符串,改成一些含义清晰的变量代替。

function getArea(shape) {

    let area = 0
    switch (shape) {

        case 'Triangle':
            area = 1
            break
        case 'Circle':
            area = 2
            break
    }

    return area
}

console.log(getArea('Triangle'))
//Triangle和Circle就是魔术字符串。多次出现,与代码形成了“强耦合”,不利于后面的修改和维护。

const shapeType = {

    triangle: Symbol(),
    circle: Symbol()
}


function getArea(shape) {

    let area = 0
    switch (shape) {

        case shapeType.triangle:
            area = 1
            break
        case shapeType.circle:
            area = 2
            break
    }

    return area
}
    
console.log(getArea(shapeType.triangle))

一个前端小白,若文章有错误内容,欢迎大佬指点讨论!


通过以上内容的阐述,相信大家对“Symbol类型声明方式是什么,如何使用呢?”已经有了进一步的了解,更多相关的问题,欢迎关注网络或到官网咨询客服。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: Symbol类型声明方式是什么,如何使用呢?
本文地址: https://pptw.com/jishu/653215.html
Go语言的字符类型有几种,作用是什么 PHP中array_filter() 函数有何用,用法是什么?

游客 回复需填写必要信息