当前位置: 首页 > article >正文

后盾人JS -- 好用的 JavaScript Symbol 类型

Symbol使用场景介绍

举个例子,当leader让你去机房取某个电脑的时候,机房那么多电脑,你怎么知道取哪个

所以这个时候symbol的作用就显现出来了(上面有什么贴纸的,什么型号的电脑)

声明定义Symbol的几种方式

两个symbol定义完之后比较是不会相等的

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        let hd = Symbol()
        console.log(typeof hd)
        let edu = Symbol("后盾人在线教程")   //添加描述
        console.log(hd.description)     //打印描述
        let cms = Symbol.for("hdcms")   //这样定义系统会有记录
        console.log(cms)     //这时候再定义判断就是相等的
        console.log(Symbol.keyFor(cms))     //可以获取到描述
        
    </script>
</body>
</html>

使用Symbol解决字符串耦合问题

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        let grade = {
            李四:{js:100,css:89},
            李四:{js:35,css:56}
        }
        console.log(grade)
    </script>
</body>
</html>

这种情况下只会打印出一个,可以用symbol解决这个问题(注意赋值和取值都要加[ ])

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        let user1 = {
            name:'李四',
            key:Symbol()
        } 
        let user2 = {
            name:'李四',
            key:Symbol()
        }
        let grade = {
            [user1.key]:{js:100,css:89},
            [user2.key]:{js:35,css:56}
        }
        console.log(grade)
    </script>
</body>
</html>

Symbol在缓存容器中的使用

symbol本质上就是生成一个永远不会重复的字符串

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        class Cache{
            static data = {}
            static set(name,value){
                return(this.data[name]=value)
            }
            static get(name){
                return this.data[name]
            }
        }
        Cache.set('hdcms','houdunren.com')
        console.log(Cache.get("hdcms"))
        let user = {
            name:'apple',
            desc:"用户资料",
            key:Symbol("用户数据")
        }
        let cart = {
            name:'apple',
            desc:"购物车",
            key:Symbol("购物车数据")
        }
        // Cache.set("user-apple",user)
        // Cache.set("cart-apple",cart)
        // console.log(Cache.get("user-apple"))
        Cache.set(user.key,user)
        Cache.set(cart.key,cart)
        console.log(Cache.get(user.key))
    </script>
</body>
</html>

扩展特性与对象属性保护

这是一些特性:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        let symbol = Symbol("这是一个symbol类型")
        let hd = {
            name:"后盾人",
            [symbol]:"houdunren.com0"
        }
        for(const key in hd){
            console.log(key)    //遍历不到,只能遍历到普通属性
        }
        for(const key of Object.getOwnPropertySymbols(hd)){
            console.log(key)        //只能遍历到symbol属性
        }
        for(const key of Reflect.ownKeys(hd)){
            console.log(key)        //可以遍历所有属性
        }
    </script>
</body>
</html>

根据这些特性可以保护私有属性

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        let site = Symbol("这是一个symbol")
        class User{
            constructor(name){
                this.name = name
                this[site] = "后盾人"
            }
            getName(){
                return `${this[site]} ${this.name}`
            }
        }
        let zs = new User('张三')
        // console.log(zs.getName())
        for(const key in zs){
            console.log(key)
        }
    </script>
</body>
</html>

玉面手雷王:


http://www.kler.cn/a/510287.html

相关文章:

  • 【2024年华为OD机试】(C卷,100分)- 悄悄话 (Java JS PythonC/C++)
  • Crewai + langchain 框架配置第三方(非原生/国产)大模型API
  • springboot医院信管系统
  • (十五)WebGL中gl.texImage2D函数使用详解
  • 差异基因富集分析(R语言——GOKEGGGSEA)
  • 【深度学习】Huber Loss详解
  • 【ArcGIS微课1000例】0140:总览(鹰眼)、放大镜、查看器的用法
  • C++实现设计模式---组合模式 (Composite)
  • RabbitMQ---TTL与死信
  • 参数校验 Spring Validation框架
  • 探秘Shortest与Stagehand:开启高效测试与自动化新篇
  • 【Idea】编译Spring源码 read timeout 问题
  • FastGPT结合New-api,遍享各类大模型
  • pytest全局配置文件pytest.ini
  • rabbitmq安装延迟队列
  • MinerU:高效智能PDF文档解析工具完全指南
  • pg_sql关于时间的函数
  • 刷题小白——排序
  • Vue + Nuxt 全面解析:构建高效 SSR 与 SSG 应用的最佳实践
  • CORS:跨域访问、如何在Nginx中配置允许跨域访问
  • Flink(十):DataStream API (七) 状态
  • SVG To Font 创建自己的字体图标库
  • 分布式锁详解
  • 从零开始学数据库 day2 DML
  • G1原理—7.G1的GC日志分析解读
  • python+django+Nacos实现配置动态更新-集中管理配置(实现mysql配置动态读取及动态更新)