1.符号值的转换
2.检索符号属性
3.使用知名符号暴露内部方法
(跳过)
符号值的转换
符号类型在进行转换时非常不灵活,因为其他类型缺乏与符号值的合理等价,尤其是符号值无法 被转换为字符串值或数值。
因此将符号作为属性所达成的效果,是其他类型所无法替代的。
本章之前的例子使用了 console.log() 来展示符号值的输出,
能这么做是由于自动调用了符号的 String() 方法来产生输出。你也可以直接调用 String() 方法来获取相同结果,
let uid = Symbol.for("uid"),
desc = String(uid);
console.log(desc); // Symbol(uid)
String() 方法调用了 uid.toString() 来获取符号的字符串描述信息。
但若你想直接将符号 转换为字符串,则会引发错误
let uid = Symbol.for("uid"),
desc = uid + ""; // 错误
不能将符号转换为数值,对符号使用所有数学运算符都会引发错误
let uid = Symbol.for("uid"),
sum = uid / 1; // 引发错误!
无论对符号使用哪种数学运算符都会导致错误,但使用逻辑运算符则不会,
因为符号值在逻辑运算中会被认为等价于true (就像 JS 中其他的非空值那样)
检索符号属性
Object.keys() 与 Object.getOwnPropertyNames() 方法可以检索对象的所有属性名称,
前者返回所有的可枚举属性名称,而后者则返回所有属性名称 而无视其是否可枚举。
两者都 不能返回符号类型的属性
ES6 新增了Object.getOwnPropertySymbols() 方法,可以检索对象的符号类型属性。
let uid = Symbol.for("uid");
let object = {
[uid]: "12345"
};
let symbols = Object.getOwnPropertySymbols(object);
console.log(symbols.length); // 1
console.log(symbols[0]); //Symbol(uid)
console.log(object[symbols[0]]); // 12345
网友评论