概述
symbol是ES6新引入的一种基础数据类型,该类型具有静态属性和静态方法,因为作为构造函数来它是不完整的,所以它不支持“new Symbol()”语法。
① Symbol()
意义
每个从Symbol()返回的symbol值都是唯一的。一个symbol值能作为对象属性的标志符。这是该数据类型仅有的目的。
语法
Symbol([description])
参数
description 可选,字符串类型。对symbol的描述,可用于调试但不是访问symbol本身。
用例
let sym1 = Symbol("foo");
let sym2 = Symbol("foo");
sym1 === sym2; // false
let sym = new Symbol(); // TypeError
② Symbol.for()
意义
全局共享的Symbol
它接受一个字符串作为参数,然后全局环境中搜索是否有以该参数注册的Symbol值。如果有,就返回这个Symbol值。没有就创建并返回一个以该字符串作为名称的Symbol值。
语法
Symbol.for(key);
参数
key 一个字符串,作为symbol注册表中与某symbol关键的键(同时也会作为该symbol的描述)。
用例
let sym1 = Symbol.for("foo");
let sym2 = Symbol.for("foo");
sym1 === sym2; // true
③ Symbol.keyFor()
意义
在全局注册表中搜索查找改symbol,如果有返回该symbol的key值,形式为string。如果没有返回undefined。
语法
Symbol.keyFor(sym);
参数
sym必选参数,存储在symbol注册表中的某个symbol。
用例
let sym= Symbol.for("foo");
console.log(Symbol.keyFor(sym)); // foo
应用场景
1:当做对象属性key来使用,但是注意用例中4中方式是无法获取到以Symbol为key的属性的。
用例
let s_name= Symbol("name");
let obj= {
[s_name]: "lle",
age: 18,
title: "Engineer"
};
console.log(Object.keys(obj)); // ["age", "title"]
for(let key in obj) {
console.log(key); // 输出age, title
}
console.log(Object.getOwnPropertyNames(obj)); // ["age", "title"]
JSON.stringify(obj); // {"age":18,"title":"Engineer"}
以上这些常规的方式都是无法获取到的
如果要获取可以用个以下三种方式
obj[s_name];// lle
Object.getOwnPropertySymbols(obj); // [Symbol(name)]
Reflect.ownKeys(obj); // ["age", "title", Symbol(name)]
2: 使用Symbol来替代常量使用
用例
const NAME = Symbol();
const Age = Symbol()
网友评论