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

ops/2025/1/19 15:28:11/

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 = namethis[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.ppmy.cn/ops/151413.html

相关文章

Vscode——SSH连接不上的一种解决办法

一、完整报错: > @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ > IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! > Someone could be eavesdropping on you right now (man-in-the

Coconut:基于连续潜在空间推理,提升大语言模型推理能力的新方法

Coconut&#xff08;连续思维链&#xff09;提出了一种新的大语言模型推理范式&#xff0c;该范式在潜在空间中进行运算&#xff0c;利用模型隐藏层生成的连续思维状态取代传统的基于文本的推理方式。系统将这些状态以输入嵌入的形式反馈至模型&#xff0c;通过广度优先搜索方法…

Python从0到100(八十四):神经网络-卷积神经网络训练CIFAR-10数据集

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

QT笔记- Qt6.8.1安卓开发配置

1. Qt添加组件Android, 注意登录时需连接VPN, 选好组件下载时可退出VPN.2. 手动下载安装java的jdk&#xff0c;版本jdk20及以下, 注意, 即便安装最新版本的Android SDK一般也不支持高版本的jdk.3. 安卓SDK, NDK, OpenSSL在Qt设置-设备-Android中按Qt提供的方式安装.4. 环境变量…

2025.1.16——四、get_post 传参方式

题目来源&#xff1a;攻防世界get_post 目录 一、打开靶机&#xff0c;分析信息 ​编辑 二、解题步骤 step 1&#xff1a;GET方式传参 step 2&#xff1a;POST方式传参——hackbar插件&#xff08;火狐浏览器&#xff09; 三、小结 一、打开靶机&#xff0c;分析信息 这…

Ettercap 入门

syntax ettercap [options] [target1] [target2] 没有目标地址或是源地址之分, 因为通信是双向的 如果接口支持IPv6&#xff0c;target 以这样的形式 MAC/IPs/IPv6/Ports否则以MAC/IPs/Ports的形式。 /10.0.0.1/表示所有mac地址&#xff0c;所有端口&#xff0c;只要ip地址是…

Linux 音视频入门到实战专栏(视频篇)视频编解码 MPP

文章目录 一、MPP 介绍二、获取和编译RKMPP库三、视频解码四、视频编码 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; &#x1f4e2;本篇将介绍如何调用alsa api来进行音频数据的播放和录制。 一、MPP 介绍 瑞芯微提供的媒体处理软件平台…

Redis 缓存穿透、击穿、雪崩 的区别与解决方案

前言 Redis 是一个高性能的键值数据库&#xff0c;广泛应用于缓存、会话存储、实时数据分析等场景。然而&#xff0c;在高并发的环境下&#xff0c;Redis 缓存可能会遇到 缓存击穿、缓存穿透 和 缓存雪崩 这三大问题。这些问题不仅影响系统的稳定性和性能&#xff0c;还经常出…