ES6知识点补充——Symbol

简介: JS查漏补缺系列是我在学习JS高级语法时做的笔记,通过实践费曼学习法进一步加深自己对其的理解,也希望别人能通过我的笔记能学习到相关的知识点。这一次我们来了解Symbol

数据类型

ECMAScript有6种简单数据类型(内存直接存的值),分别是Undefined,Null,Boolean,Number,String,Symbol,还有一种复杂的数据类型(内存存的是引用地址)=>Object(对象)。

而我们接下来要讲的是ES6中新增的一个基本数据类型——Symbol

Symbol

在我们与别人合作的时候,我们不知道别人会在某个对象中定义了什么属性,而我们往里面添加同名的属性,很容易会造成冲突,将内部的属性覆盖掉,这是我们不想要的结果,而 Symbol 能够解决这样的问题

Symbol 数据类型是一种原始数据类型,表示独一无二的值。该类型的性质在于这个类型的值可以用来创建匿名的对象属性。

  • Symbol值是通过Symbol函数来生成的,生成后可以作为属性名;
  • 也就是在ES6中,对象的属性名可以使用字符串,也可以使用Symbol值
// ES6之前, 对象的属性名(key) 都是 字符串
var obj = {
  name: "a",   // 属性名name相当于'name'
}

// 虽然首字母大写,但它仍是一个函数
const s1 = Symbol()
const s2 = Symbol()

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

Symbol值作为key的用法

  1. 在定义对象字面量时使用
const obj = {
  [s1]: "abc",
  [s2]: "cba"
}
  1. 新增属性
// 新增属性
obj[s3] = "nba"

//Object.defineProperty方式来新增/定义
const s4 = Symbol()
Object.defineProperty(obj, s4, {
  enumerable: true,
  configurable: true,
  writable: true,
  value: "mba"
})
  1. 获取obj 中用 Symbol 值作为 key 的属性
console.log(obj[s1], obj[s2], obj[s3], obj[s4])
// 注意: 不能通过.语法获取
// console.log(obj.s1)

注意:使用Symbol作为key的属性名,在遍历Object.keys等中是获取不到这些Symbol值,需要Object.getOwnPropertySymbols来获取所有Symbol的key

var obj = {};
var a = Symbol('a');
var b = Symbol('b');

obj[a] = 'Hello';
obj[b] = 'World';

var objectSymbols = Object.getOwnPropertySymbols(obj);

console.log(objectSymbols);
// [Symbol(a), Symbol(b)]

扩:Symbol.for(key)/Symbol.keyFor(symbol)

如果我们希望使用同一个 Symbol 值,可以使用 Symbol.for
const sa = Symbol.for("aaa")
const sb = Symbol.for("aaa")
console.log(sa === sb) // true
Symbol.keyFor 方法返回一个已登记的 Symbol 类型值的 key
const sa = Symbol.for("aaa")
const key = Symbol.keyFor(sa)
console.log(key) // aaa

参考资料和扩展:
冴羽的博客——ES6 系列之模拟实现 Symbol 类型:https://github.com/mqyqingfeng/Blog/issues/87

目录
相关文章
|
4月前
|
JavaScript 前端开发
ES6:什么是Symbol?
ES6:什么是Symbol?
52 1
|
4月前
ES6之Symbol
ES6之Symbol
|
4月前
|
JavaScript 前端开发
|
4月前
|
JavaScript 前端开发 开发者
|
2月前
|
存储 JavaScript 前端开发
JavaScript编码之路【ES6新特性之 Symbol 、Set 、Map、迭代器、生成器】(二)
JavaScript编码之路【ES6新特性之 Symbol 、Set 、Map、迭代器、生成器】(二)
36 1
|
2月前
|
存储 JavaScript 前端开发
JavaScript编码之路【ES6新特性之 Symbol 、Set 、Map、迭代器、生成器】(一)
JavaScript编码之路【ES6新特性之 Symbol 、Set 、Map、迭代器、生成器】(一)
23 0
|
4月前
|
存储 JavaScript
ES6+新特性-Symbol与Set/Map数据结构
ES6 引入了三种新的数据结构:Symbol、Set和Map。Symbol是唯一且不可变的值,常用于定义对象的独特属性;Set存储不重复值,适合数组去重;Map则是键值对集合,键可为任意类型,提供了更灵活的存储方式。这些新数据结构提供了更高效的操作手段,分别解决了属性命名冲突、数据去重和复杂键值对存储的问题。示例展示了如何使用Symbol、Set和Map进行基本操作。
|
4月前
|
JavaScript
js开发:请解释什么是ES6的Symbol,以及它的用途。
ES6的Symbol数据类型创建唯一值,常用于对象属性键(防冲突)和私有属性。示例展示了如何创建及使用Symbol:即使描述相同,两个Symbol也不等;作为对象属性如`obj[symbol1] = 'value1'`;也可作枚举值,如`Color.RED = Symbol('red')`。
37 4
|
4月前
|
JavaScript 前端开发
ES6之原始数据类型Symbol
ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值。它属于 JavaScript 语言的原生数据类型之一,其他数据类型是:undefined、null、布尔值(Boolean)、字符串(String)、数值(Number)、大整数(BigInt)、对象(Object)。Symbol的作用是创建一个不可变且唯一的标识符,可以用作对象属性的键。它可以用来解决属性名冲突的问题,避免命名冲突。
56 0