创建Symbol
let firstName = Symbol();
let person = {};
person[firstName]="fly";
//Symbol是原始值,调用new Symbol()会导致程序报错
Symbol函数接受可选参数,用于描述,不可用于属性访问。
let firstName = Symbol("first name");
let person = {};
person[firstName] = "Nicholas";
console.log("first name" in person); // false
console.log(person[firstName]); // "Nicholas"
console.log(firstName); // "Symbol(first name)"
使用Symbol
let firstName = Symbol("first name");
// use a computed object literal property
let person = {
[firstName]: "Nicholas"
};
// make the property read only
Object.defineProperty(person, firstName, { writable: false });
console.log(person[firstName]); // "Nicholas"
全局Symbol注册表
创建一个可共享的Symbol:
Symbol.for();
没有就创建,有的话调用。
在全局注册表中检索与Symbol有关的键:
Symbol.keyfor();
全局注册表是一个类似全局作用域的共享环境。
Symbol与强制类型转换
let uid = Symbol.for("uid"),
desc = String(uid);
console.log(desc); // "Symbol(uid)"
Symbol不可拼接或转换为字符串或转换为数字。
Symbol属性检索
Object.keys():返回所有可列举属性名
Object.getOwnPropertyNames():返回所有属性名,不管是否可枚举
Well-known Symbol暴露内部操作
Symbol.hasInstance方法
函数的方法,确定对象是否为函数的实例。
obj instanceof Array;
//等价于
Array[Symbol.hasInstance](obj);
Object.defineProperty(MyObject, Symbol.hasInstance, {
value: function(v) {
return false;
}
});
Symbol.方法 | 作用 | 参数 | 返回值 [有]/[无] |
---|---|---|---|
hasInstance | 检测继承信息 | 对象 | true |
toPrimitive | 返回对象原始值//valueOf//toString() | 值 | 原始值 |
match | 比较字符串 | 字符串 | 匹配元素的数组/null |
replace | 替换字符串 | 原始字符串(,替换字符串) | 字符串 |
search | 定位子串 | 字符串 | 匹配到返回索引或-1 |
split | 分解字符串 | 字符串 | 返回包含分解后片段的数组 |
Symbol.属性 | 表示 | 属性值 |
---|---|---|
isConcatSpreadable | 配置某对象作为Array.prototype.concat()方法的参数时是否展开 | 其数组元素属性为布尔值,为true,则表示对象有length属性和数字键 |
toStringTag | 创建对象描述 | |
unscopables | 定义不可被with引用的对象属性名称的对象集合 |
Symbol.toPrimitive()
数字模式优先级排序:
- 调用valueOf()方法,如果结果为原始值,则返回。
- 否则,调用toString方法,如果结果为原始值,则返回。
- 如果再无可选值,则抛出错误。
字符串模式优先级排序:
- 调用toString()方法,如果结果为原始值,则返回。
- 否则,调用valueOf()方法,如果结果为原始值,则返回。
- 如果再无可选值,则抛出错误。