js的Symbol使用
JS symbol 使用
2023-09-11 14:19:18 时间
Symbol
1、Symbol使用方法
let s = Symbol();
console.log(s);
Symbol永远不会是一样
Symbol是一个永远不会出现相同的字符串。在我们声明同一个变量的时候,如果重复出现,那麽只会打印第一次声明的那个变量。
let a = Symbol();
let b = Symbol();
console.log(a == b); // false
不能往里面压属性
let a = Symbol();
a.name = "Symbol";
console.log(a.name);
加上一个描述
toString()打印其字符串
description 打印出对Symbol的描述
let a = Symbol('Symbol学习');
console.log(a.description);
2、Symbol另一种定义方法
使用该方法,Symbol会在内存中开辟一个内存记录,如果使用重复的变量,可以使用Symbol.for()来定义。Symbol.keyFor()可以获得对Symbol的描述。
let symbol = Symbol.for('Symbol.for学习');
let symbol1 = Symbol.for('Symbol.for学习');
console.log(symbol == symbol1); // true
console.log(Symbol.keyFor(symbol)); // 获得对Symbol的描述
使用Symbol.for定义的会在全局保存,而使用普通的Symbol来定义的不是在全局定义,我们读取不到。
let symbol = Symbol('Symbol学习');
let symbol1 = Symbol.for('Symbol.for学习');
console.log(Symbol.keyFor(symbol)); // 读取不到
console.log(Symbol.keyFor(symbol1)); // 可以读取到
3、Symbol的使用
通过对象的声明方式得到user1和user2两个,其两个key都通过Symbol来绑定,在grade中使用是,user1.key需要使用‘ [] ’ 进行包裹,否则会当作字符串处理,[user1,key]则表示拿到对应的变量。最后可以通过自己想找到的元素来完成调用。
let user1 = {
name: '李四',
key: Symbol()
};
let user2 = {
name: '李四',
key: Symbol()
};
let grade = {
[user1.key]: {
js: 100,
css: 89
},
[user2.key]: {
js: 66,
css: 55
}
}
console.log(grade[user1.key]);
4、Symbol在缓存容器中的使用
为了更好的使用这个Symbol,我们常常会把公共的东西放在一个容器里面共享。
- 通过下面声明变量,然后指定某个元素内特定的值进行输出。
let user = {
name: "apple",
dese: "用户资料",
};
let cart = {
name: "apple",
dese: "购物车",
};
Cache.set('user-apple', user);
Cache.set('cart-apple', cart);
console.log(Cache.get("cart-apple"));
- 通过key绑定Symbol完成不重复的调用
let user = {
name: "apple",
dese: "用户资料",
key: Symbol('会员资料')
};
let cart = {
name: "apple",
dese: "购物车",
key: Symbol('购物车资料')
};
Cache.set(user.key, cart);
Cache.set(cart.key, cart);
console.log(Cache.get(user.key));
拓展
在我们数据不能公布或者改元素作为私有属性可以使用Symbol,但使用Symbol以后,想调用该属性内的元素不能使用for in 、 for of来使用,若想获取到symbol里面的元素,只能使用getOwnPropertySymbols;若想得到该数组的常用变量和symbol的属性,可以使用Reflect.ownKeys得到。
<script>
let symbol = Symbol('这是一个Symbol类型');
let a = {
name: 'abc',
// 认为它是私有属性,受保护
[symbol]: 'abcdefg'
};
// Symbol不能使用for in来遍历
// for (const key in a) {
// console.log(key); // name
// }
// Symbol也不能使用for of来遍历
for (const key of Object.keys(a)) {
console.log(key);
}
// 若想遍历Symbol的属性,我们可以使用 getOwnPropertySymbols, 该方法不能遍历普通类型
for (const key of Object.getOwnPropertySymbols(a)) {
console.log(key);
}
// Reflect.ownKeys 遍历所有的属性
for (const key of Reflect.ownKeys(a)) {
console.log(key);
}
let site = Symbol("这是Symbol");
class User {
constructor(name) {
this.name = name;
this[site] = "symbol"
}
getName() {
return `${this[site]} ${[this.name]}`;
}
}
let user1 = new User('李四');
console.log(user1.getName()); // symbol 李四
for (const key in user1) {
console.log(key); // 只能看到name
}
</script>
相关文章
- js 生成4位随机数及Js知识汇总
- JS 逆向 --- 过无限debugge、hook、js混淆还原、控制流混淆
- [转] 使用moment.js轻松管理日期和时间
- html table表格导出excel的方法 html5 table导出Excel HTML用JS导出Excel的五种方法 html中table导出Excel 前端开发 将table内容导出到excel HTML table导出到Excel中的解决办法 js实现table导出Excel,保留table样式
- 【Js】前端使用xlsx.full.min.js读取和导出excel表格数据
- JS监听不到被操作后dom的事件,js动态生成的DOM绑定事件失效,解决方案
- JS基础 Symbol 用于防止属性名冲突
- 【Vue/js】Js中执行变量中的命令语句,也就是所谓的宏替换(很实用的例子)
- js格式化日期工具类
- 爬虫之JS的解析确定js的位置
- 【JS】强化Promise理解,从零手写属于自己的Promise.all与Promise.race
- js中的坑
- js 介绍
- 【HarmonyOS】【JS】 鸿蒙js开发使用div自带的scroll,滑动条拉不到最下面?
- JS - Promise
- JS模式:jq中简单的模式--》采摘自js设计(tomxu_version)
- JS数组对象排序
- JS教程之Electron.js设计强大的多平台桌面应用程序的好工具
- 聊聊JS动画库:Velocity.js
- 有趣的HTML实例(八) 一个很有趣的动态背景(css+js)
- JS 将数字字符串数组转为 数字数组 (互换),js获取数组对象中 某一个key的值,js判断一个数组是否包含另一个数组(一维数组)
- 几种解决JS数字精度丢失的方法
- [js高手之路]node js系列课程-图解express+supervisor+ejs用法
- 推荐4款高星星JS库:canvas库-Fabric.js、JavaScript客户端文件上传库-FilePond、客户端保存文件解决方案-FileSaver、JavaScript在线解压 ZIP 文件-JSZip
- 【Laya + TS + JS】SheetJS(js-xlsx)前端生成Excel表格
- js面试题(一)
- JS实现鼠标经过用户头像显示资料卡的效果,可点击
- java结合node.js非对称加密,实现密文登录传参——让前后端分离的项目更安全
- JavaScript对象详解,深入理解js对象