# Symbol
Symbol 在 JavaScript 里面是一种原始基本数据类型,每一个 Symbol 值都是唯一的。
通过Symbol()获取一个 Symbol 值,不支持new Symbol()调用。
# 获取对象的 Symbol 属性集合
Object.getOwnPropertySymbols(obj)
# 静态方法
# Symbol.for([str])
使用一个字符串生成一个全局共享的 Symbol 值
var symbol = Symbol.key("foo");
1
# Symbol.keyFor(symbol: Symbol)
获取生成 Symbol 值的字符串
var foo = Symbol.keyForm(symbol);
console.log(foo); // 'foo'
1
2
2
# 静态属性
# Symbol.length
Symbol 的长度,返回 0
# Symbol.prototype
Symbol 的原型对象
# 内建的 Symbol
# 迭代 Symbol
Symbol.iterator
作为可迭代对象的 Symbol 属性,指定了该属性的对象可以使用for...of迭代访问
# 正则表达式 Symbol
Symbole.match
RegExp.prototype的 Symbol 属性,被String.prototype.match调用
Symbole.search
RegExp.prototype的 Symbol 属性,被String.prototype.search调用
Symbole.replace
RegExp.prototype的 Symbol 属性,被String.prototype.replace调用
Symbole.split
RegExp.prototype的 Symbol 属性,被String.prototype.split调用
# 其他 Symbol
Symbol.hasInstance
被instanceof调用
obj instanceof Obj;
// 等同于调用
Obj[Symbol.hasInstance](obj);
1
2
3
2
3
Symbol.isConcatSpreadable
定义Array.prototype.concat()调用时是否展开对象或者数组。
Symbol.unscopablesSymbol.speciesSymbol.toPrimitiveSymbol.toStringTag
# 面试
- 为什么不支持
new Symbol()的调用?
围绕原始数据类型的包装对象从 ECMAScript 2015 不再受支持。因为保持向前兼容,保留以前的new String()、new Boolean()、new Number()方法
- 怎样阻止使用
new创建实例?
在函数内部使用new.target,如果使用new调用函数,则new.target等于函数,否则等于undefined