ES6 引入了一种新的原始数据类型 Symbol,表示独一无二的值。它是
JavaScript 语言的第七种数据类型
Symbol 特点:
1. Symbol 的值是唯一的
,用来解决命名冲突的问题,即使参数相同
// 没有参数的情况
let name1 = Symbol();
let name2 = Symbol();
name1 === name2 // false
name1 === name2 // false
// 有参数的情况
let name1 = Symbol('flag');
let name2 = Symbol('flag');
name1 === name2 // false
name1 === name2 // false
2.Symbol 值不能与其他数据进行运算
- 数学计算:不能转换为数字
- 字符串拼接:隐式转换不可以,但是可以显示转换
- 模板字符串
3) Symbol 定义的对象属性不参与 for…in/of 遍历,但是可以使用
Reflect.ownKeys / Object.getOwnPropertySymbols()
来获取对象的所有键名
let sy = Symbol();
let obj = {
name:"zhangsan",
age:21
};
obj[sy] = "symbol";
console.log(obj); //{name: "zhangsan", age: 21, Symbol(): "symbol"}
for(let key in obj) {
console.log(key);
} //只输出了name,age
Object.getOwnPropertySymbols(obj); //[Symbol()]
Reflect.ownKeys(obj); //["name", "age", Symbol()]
Object.keys(obj); //["name", "age"]
Object.getOwnPropertyNames(obj) //["name", "age"]
Object.keys(obj) //["name", "age"]
Object.values(obj) //["zhangsan", 21]
JSON.stringify(obj) //{"name":"zhangsan","age":21}
注: 遇到唯一性的场景时要想到 Symbol
Symbol的方法:
1.Symbol.for()
作用:用于将描述相同的Symbol变量指向同一个Symbol值
,这样的话,就方便我们通过描述(标识)区分开
不同的Symbol了,阅读起来方便
Symbol.for("foo"); // 创建一个 symbol 并放入 symbol 注册表中,键为 "foo"
Symbol.for("foo"); // 从 symbol 注册表中读取键为"foo"的 symbol
Symbol.for("bar") === Symbol.for("bar"); // true,证明了上面说的
Symbol("bar") === Symbol("bar"); // false,Symbol() 函数每次都会返回新的一个 symbol
var sym = Symbol.for("mario");
sym.toString();
// "Symbol(mario)",mario 既是该 symbol 在 symbol 注册表中的键名,又是该 symbol 自身的描述字符串
Symbol()和Symbol.for()的相同点:
- 它们定义的值类型都为"symbol";
Symbol()和Symbol.for()的不同点:
-
Symbol()定义的值不放入全局 symbol 注册表中,每次都是新建
,即使描述相同值也不相等; -
用 Symbol.for() 方法创建的 symbol 会被放入一个全局 symbol 注册表中。
Sy