一、symbol基础
1-1 symbol作用
- symbol是ES6新增的一种基本数据类型,最大特点就是“独一无二”,作用就是防止属性命名冲突,覆盖
- symbol的参数只是一个描述,并不会因为参数相同导致两个symbol相同!!
// 没有参数的情况
var s1 = Symbol();
var s2 = Symbol();
s1 === s2 // false
// 有参数的情况
var s1 = Symbol("foo");
var s2 = Symbol("foo");
s1 === s2 // false
1-2 symbol使用方法
let mySymbol = Symbol();
// 第一种写法
let a = {};
a[mySymbol] = 'Hello!';
// 第二种写法
let a = { [mySymbol]: 'Hello!'};
// 第三种写法
let a = {};
Object.defineProperty(a, mySymbol, { value: 'Hello!' });
// 以上写法都得到同样结果
a[mySymbol] // "Hello!"
二、symbol特性
- Symbol 值通过 Symbol 函数生成,使用 typeof,结果为 “symbol”
- Symbol 函数前不能使用 new 命令,否则会报错。这是因为生成的 Symbol 是一个基本数据类型的值,不是对象。
- instanceof Symbol的结果为 false
Symbol 可以接受一个参数作为自己的描述
// 参数为字符串
var s1 = Symbol('foo');
console.log(s1); // Symbol(foo)
// 参数为对象,会先调用该对象的toString方法,转为字符串
const obj = {
toString() {
return 'abc';
}
};
const sym = Symbol(obj);
console.log(sym); // Symbol(abc)
Symbol 值不能与其他类型的值进行运算,会报错。
Symbol 值可以显式转为字符串。
var sym = Symbol('My symbol');
console.log(String(sym)); // 'Symbol(My symbol)'
console.log(sym.toString()); // 'Symbol(My symbol)'
Symbol 作为属性名(key值),该属性不会被 for…in 循环枚举,也不会被 Object.keys()、Object.getOwnPropertyNames()、JSON.stringify() 返回。但是,它也不是私有属性,有一个 Object.getOwnPropertySymbols 方法,可以获取指定对象的所有 Symbol 属性名。 ```javascript 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)]
8. 生成同一个Symbol值可以使用Symbol.for,它接受一个字符串作为参数,然后搜索有没有以该参数作为名称的 Symbol 值。如果有,就返回这个 Symbol 值,否则就新建并返回一个以该字符串为名称的 Symbol 值。
```javascript
var s1 = Symbol.for('foo');
var s2 = Symbol.for('foo');
console.log(s1 === s2); // true
- Symbol.keyFor 方法返回一个已登记的 Symbol 类型值的 key ```javascript var s1 = Symbol.for(“foo”); console.log(Symbol.keyFor(s1)); // “foo”
var s2 = Symbol(“foo”); console.log(Symbol.keyFor(s2) ); // undefined ```