概述
- Symbol 是一种新的数据类型
- 与
null
或undefined
等六种类型并列。typeof
的结果是symbol
- 使用
Symbol()
创建的值,独一无二,与标识相同的symbol值也不同,没有登记机制 - 不能与其他类型进行运算,拼接也不行
- 可显式转化成字符串
- 可以转化成布尔类型
- 不可以转化成数值类型
作为属性名的Symbol
var mySymbol = Symbol();
var a = {
[mySymbol] : 'hello!'
}
// 只能用这种方式
a[mySymbol]
消除魔术字符串
魔术字符串,指的是在代码中多次出现,并且与代码形成强耦合的具体字符串或者数值
- 其实这个案例是作为属性值的Symbol
const shapgeType = {
triangle: Symbol()
};
function () {
// 只要 shapgeType 有属性即可,不需要属性值
}
属性名的遍历
- Symbol作为属性名,不会出现在
for in
for of
object.keys()
object.getOwnPropertyNames()
JSON.stringify()
- 可以通过以下方法获取
-
object.getOwnPropertySymbols()
,返回一个数组 -
Reflect.ownKeys
可以返回所有里类型的键名,包含常规键名和Symbol键名
Symbol.for()
和 Symbol.keyFor()
-
Symbol.for()
相当于进行了登记 -
Symbol.keyFor()
可以找到登记的Symbol
- 登记的
Symbol
是全局环境的,跨越iframe
// 不登记的情况
var s1 = Symbol('hi');
var s2 = Symbol('hi');
s1 === s2; // false
// 登记的情况
var s1 = Symbol.for('hi');
var s2 = Symbol.for('hi');
s1 === s2; // true
内置的 Symbol
值
ES6 内置了11个Symbol值,可以与一些方法结合使用。
-
Symbol.hasInstance
和instanceof
-
Symbol.isConcatSpreadable
和 数组的concat
方法 -
Symbol.match
和str.match()
-
Symbol.iterator
指向对象的默认遍历器方法 - 还有很多
// 对象进行 for of 循环时,会调用 Symbol.iterator 方法
网友评论