JavaScript 学习-25.Symbol 类型
2022/5/26 1:51:17
本文主要是介绍JavaScript 学习-25.Symbol 类型,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
前言
Symbol 是 ES6 中新添加的特性,生成一个唯一标识符,可用于属性名称、也可用于属性值。目的是消除属性名称冲突。
Symbol 简介
JavaScript 提供了7种基本数据类型:Number 、 String 、 Boolean 、 Object、 null 和 undefined ,还有 Symbol
Symbol 是原始数据类型,不是对象,所以Symbol 函数栈不能用 new 命令
创建一个Symbol值
let s = Symbol('hello');
Symbol() 函数接受一个可选参数作为描述, 注意仅仅只是描述,方便阅读,不会影响它的值。
let s1 = Symbol('hello'); let s2 = Symbol('world'); console.log(s1); // Symbol(hello) console.log(s2); // Symbol(world)
当我们使用console.log()去打印symbol的时候会隐式调用symbol的toString()方法
Symbol() 函数每次调用会创建一个新的独一无二的值,所以2个Symbol()的值是不相等的
console.log(Symbol() === Symbol()); // false
两个参数名称一样,得到的值也不一样(参数仅仅只是描述,方便阅读)
let s1 = Symbol('hello'); let s2 = Symbol('hello'); console.log(s1); // Symbol(hello) console.log(s2); // Symbol(hello) console.log(s1 === s2) // false
Symbol是原始类型,也不能使用new去创建
let s = new Symbol(); // 这是错误的写法
Symbol 作为对象属性
对象的属性只能是字符串,并且属性不能重复,可以用symbol作为对象的键
const name = Symbol(); const obj = { [name]: 'hello', address: '上海市' }; console.log(obj); // ['address', Symbol()]
Symbol作为对象属性名时,不能使用点运算符
const obj = {}; const name = Symbol(); obj[name] = 'hello'; obj.address= '上海市'; console.log(obj); // {address: '上海市', Symbol(): 'hello'} console.log(name in obj); // true console.log(obj[name ]); // hello console.log(Object.keys(obj)); // ['address']
Object.keys()无法获取到 symbol 类型的键, 因为Symbol 是ES6 中新添加的类型。
- Symbol作为对象属性名时,不能使用点运算符,使用点运算符后,这个属性名就是一个普通字符串了,而不是Symbol类型。
- Symbol属性名具有隐藏性,是不可枚举属性,所以这个属性不能使用for...in、for...of、Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()等方法访问到
另一个新的 Reflect.ownKeys()方法可以返回所有类型的键名,包括常规键名和 Symbol 键名。
const obj = {}; const name = Symbol(); obj[name] = 'hello'; obj.address= '上海市'; console.log(Reflect.ownKeys(obj)); // ['address', Symbol()]
私有属性
当多个模块修改对象的同一个属性时,可能会导致属性被重新赋值,存在一定的风险,由于JavaScript里面没有私有属性。
Symbol 作为属性具有唯一性,可以当成是私有属性。
比如当公共模块有一个person对象
// person 公共模块 const person = { name: 'hello', address: '上海市' };
在其它2个模块都给person对象一个id属性
function lib1(obj) { obj.id = 123; } function lib2(obj) { obj.id = 456; } lib1(person); lib2(person); console.log(person.id); //456
那么id属性的值会被覆盖掉。于是可以用Symbol解决这种问题
function lib1(obj) { obj[Symbol('id1')]= 123; } function lib2(obj) { obj[Symbol('id1')] = 456; } lib1(person); lib2(person);
Symbol.for()
Symbol.for(key) 方法会根据给定的键 key,来从运行时的 symbol 注册表中找到对应的 symbol,如果找到了,则返回它,否则,新建一个与该键关联的 symbol,并放入全局 symbol 注册表中。
let x = Symbol("hello"); let x1 = Symbol.for("hello"); console.log(x === x1); // false let x2 = Symbol.for("hello"); console.log(x1 === x2); // true
为了防止冲突,最好给你要放入 symbol 注册表中的 symbol 带上键前缀。
Symbol.for("mdn.foo"); Symbol.for("mdn.bar");
Symbol.keyFor()
Symbol.keyFor() 返回一个已登记的 Symbol 类型值的 key ,用来检测该字符串参数作为名称的 Symbol 值是否已被登记。
let x1 = Symbol.for("hello"); console.log(Symbol.keyFor(x1)); // "hello"
Symbol更多的教程学习https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Symbol
这篇关于JavaScript 学习-25.Symbol 类型的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-27数据结构与算法面试题详解及练习
- 2024-12-27网络请求面试题详解与实战
- 2024-12-27数据结构和算法面试真题详解与实战教程
- 2024-12-27网络请求面试真题解析与实战教程
- 2024-12-27数据结构和算法大厂面试真题详解与实战指南
- 2024-12-27TS大厂面试真题解析与应对策略
- 2024-12-27TS大厂面试真题详解与解析
- 2024-12-27网站安全入门:如何识别和修复漏洞
- 2024-12-27SQL注入基础教程
- 2024-12-27初学者指南:理解和修复跨域漏洞