// 上面代码中,s1和s2是两个 Symbol 值。如果不加参数,它们在控制台的输出都是Symbol(),不利于区分。有了参数以后,就等于为它们加上了描述,输出的时候就能够分清,到底是哪一个值。 // 所以值一样的时候,他们还是不相等的,只是一个描述
Symbol在对象中的应用
由于每一个 Symbol 值都是不相等的,这意味着 Symbol 值可以作为标识符,用于对象的属性名,就能保证不会出现同名的属性。
1 2 3 4 5 6 7 8 9 10 11 12 13
et mySymbol = Symbol();
// 第一种写法 let a = {}; a[mySymbol] = 'Hello!';
// 第二种写法 let a = { [mySymbol]: 'Hello!' };
// 以上写法都得到同样结果 a[mySymbol] // "Hello!"
Symbol对象元素的保护作用
1 2 3 4 5 6 7 8
// 使用Symbol来进行保护年龄。 let obj={name:'jspang',skill:'web'}; let age=Symbol(); obj[age]=18; for (let item in obj){ console.log(obj[item]); // 这里是看不到年龄的 } console.log(obj);
Symbol.for(),Symbol.keyFor()
有时,我们希望重新使用同一个 Symbol 值,Symbol.for方法可以做到这一点。
1 2 3 4 5 6
let s1 = Symbol.for('foo'); let s2 = Symbol.for('foo');
s1 === s2 // true
// 接受一个字符串作为参数,然后搜索有没有以该参数作为名称的 Symbol 值。如果有,就返回这个 Symbol 值,否则就新建并返回一个以该字符串为名称的 Symbol 值。
Symbol.keyFor方法返回一个已登记的 Symbol 类型值的key。
1 2 3 4 5
let s1 = Symbol.for("foo"); Symbol.keyFor(s1) // "foo"
let s2 = Symbol("foo"); Symbol.keyFor(s2) // undefined