ES6: Symbol概念与用法举例

简介: ES6: Symbol概念与用法举例

概念: ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值。

1-使用Symbol作为对象属性名

let name = Symbol()
let age = Symbol()
var obj = {
    [name]:"kerwin",
    [age]:100
}

举例理解:


a.给对象添加独一无二的属性

let obj = {
  name: 'Jack'
}
let name = Symbol()
obj[name] = "Mike"
console.log(obj); // {name: 'Jack', Symbol(): 'Mike'}
console.log(obj[name]); // Mike

b. 便于定义公共库


这里封装属性和方法时, 全部采取Symbol类型, 这样别人就算往里面加name、age等同名的属性或方法, 也不会影响对象原本使用

let keys = {
  name: Symbol(),
  age: Symbol(),
  location: Symbol(),
  test: Symbol(),
}
let obj = {
  [keys.name]: "Mike",
  [keys.age]: 100,
  [keys.location]: "WUXI",
  [keys.test](){
    console.log("test");
  }
}
console.log(obj); // {Symbol(): 'Mike', Symbol(): 100, Symbol(): 'WUXI'}
obj[keys.test]() // test

注意:

let s1 = Symbol()
//1. 不能进行运算
console.log(s1>2); // Uncaught TypeError: Cannot convert a Symbol value to a number
//2. 显示调用toString()
console.log(s1.toString() + "aaa");
//3. 隐式转换boolean
if(s1){
  console.log("执行");
}

2-Symbol()函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述。这主要是为了在控制台显示,比较容易区分。

let keys = {
  name: Symbol("name"),
  age: Symbol("age"),
  location: Symbol("localtion"),
  test: Symbol("test"),
}
let obj = {
  [keys.name]: "Mike",
  [keys.age]: 100,
  [keys.location]: "WUXI",
  [keys.test](){
    console.log("test");
  }
}
console.log(obj); 
// {Symbol(name): 'Mike', Symbol(age): 100, Symbol(localtion): 'WUXI', Symbol(test): ƒ}

3-遍历问题


Symbol的值无法被for in进行遍历

let keys = {
    name:Symbol("name"),
    age:Symbol("age")
}
var obj = {
  [keys.name]:"kerwin",
  [keys.age]:100,
  a:1,
  b:2,
  c:3
}
// 输出对象中的普通属性
for(let i in obj) {
  console.log(i); // a b c
}
// 输出对象中的Symbol属性
console.log(Object.getOwnPropertySymbols(obj)); // [Symbol(name), Symbol(age)]
// 遍历输出 Reflect.ownKeys(obj) 可以找到对象中所有的属性,并返回一个数组
Reflect.ownKeys(obj).forEach(item=>{
  console.log(item,obj[item])
})
/**
 * Symbol(name) 'kerwin'
 * test.html:32 Symbol(age) 100
*/

补充: 拿到Symbol的属性Object.getOwnPropertySymbols(obj)


4-Symbol.for()可以重新使用同一个 Symbol 值

var obj  ={
    [Symbol.for("name")]:"kerwin",
    [Symbol.for("age")]:100
}
console.log(obj[Symbol.for("name")]) // kerwin

5-Symbol表示独一无二的常量


case只能使用规定常量

const VIDEO = Symbol();
const AUDIO = Symbol();
const IMAGE = Symbol();
function play(type) {
  switch(type) {
    case VIDEO:
      console.log("VIDEO");
      break;
    case AUDIO:
      console.log("AUDIO");
      break;
    case IMAGE:
      console.log("IMAGE");
      break;
  }
}
play(VIDEO) // VIDEO

参考: 千锋 011-ES6-Symbol_哔哩哔哩_bilibili  


相关文章
|
6月前
|
JavaScript 前端开发
ES6:什么是Symbol?
ES6:什么是Symbol?
76 1
|
9天前
|
设计模式 JavaScript 前端开发
es6加上symbol的基础数据类型
【10月更文挑战第30天】ES6 中的 `Symbol` 作为一种新的基础数据类型,为 JavaScript 提供了一种创建唯一标识符和处理对象属性名冲突的有效方式,丰富了 JavaScript 的数据类型体系和编程模式,在实际开发中具有重要的应用价值。
|
9天前
|
设计模式 JavaScript 前端开发
es6加上symbol的基础数据类型
【10月更文挑战第22天】ES6中的 `Symbol` 作为一种新的基础数据类型,为JavaScript提供了一种创建唯一标识符和处理对象属性名冲突的有效方式,丰富了JavaScript的数据类型体系和编程模式,在实际开发中具有重要的应用价值。
|
4月前
|
存储 JavaScript 前端开发
JavaScript编码之路【ES6新特性之 Symbol 、Set 、Map、迭代器、生成器】(二)
JavaScript编码之路【ES6新特性之 Symbol 、Set 、Map、迭代器、生成器】(二)
51 1
|
4月前
|
存储 JavaScript 前端开发
JavaScript编码之路【ES6新特性之 Symbol 、Set 、Map、迭代器、生成器】(一)
JavaScript编码之路【ES6新特性之 Symbol 、Set 、Map、迭代器、生成器】(一)
36 0
|
6月前
|
存储 JavaScript
ES6+新特性-Symbol与Set/Map数据结构
ES6 引入了三种新的数据结构:Symbol、Set和Map。Symbol是唯一且不可变的值,常用于定义对象的独特属性;Set存储不重复值,适合数组去重;Map则是键值对集合,键可为任意类型,提供了更灵活的存储方式。这些新数据结构提供了更高效的操作手段,分别解决了属性命名冲突、数据去重和复杂键值对存储的问题。示例展示了如何使用Symbol、Set和Map进行基本操作。
|
6月前
OFDM SYMBOL的概念及其速率
OFDM SYMBOL的概念及其速率
194 1
|
6月前
|
JavaScript
js开发:请解释什么是ES6的Symbol,以及它的用途。
ES6的Symbol数据类型创建唯一值,常用于对象属性键(防冲突)和私有属性。示例展示了如何创建及使用Symbol:即使描述相同,两个Symbol也不等;作为对象属性如`obj[symbol1] = 'value1'`;也可作枚举值,如`Color.RED = Symbol('red')`。
52 4
|
6月前
ES6之Symbol
ES6之Symbol
|
6月前
|
JavaScript 前端开发