# Symbol
ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值。它是 JavaScript 语言的第七种数据类型,前六种是:undefined、null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)。
ES5 的对象属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有方法产生冲突。如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突。这就是 ES6 引入Symbol的原因。
- Symbol 的值都是唯一的 永不相等
<script>
var s1 = Symbol();
var s2 = Symbol();
console.log(s1 === s2); // false
</script>
- 标识 Symbol函数接受一个可选参数,可以添加一段文本描述即将创建的Symbol,这段属描述不可用于属性访问,但是建议每次创建Symbol时都添加一段描述,便于阅读代码和调试Symbol程序。
<script>
var s1 = Symbol("我是s1的描述"); // 作用是方便理解这个定义的值是做什么用处
var s2 = Symbol("我是s2的描述");
console.log(s1 === s2); // false
var s3 = Symbol("不凡学院");
var s4 = Symbol("不凡学院");
console.log(s3 === s4); // false
</script>
- 获取Symbol里面的描述信息 .description
<script>
var s3 = Symbol("不凡学院");
console.log(s3.description); // 不凡学院
</script>
- 作为属性名的 Symbol
由于每一个 Symbol 值都是不相等的,这意味着 Symbol 值可以作为标识符,用于对象的属性名,就能保证不会出现同名的属性。这对于一个对象由多个模块构成的情况非常有用,能防止某一个键被不小心改写或覆盖。
注意,Symbol 值作为对象属性名时,不能用点运算符。
- 赋值的第一种方式
<script>
var s1 = Symbol();
var obj = {
name : "张三"
}
obj[s1] = 50;
console.log(obj[s1])
</script>
- 赋值的第二种方式
<script>
var s1 = Symbol("我是s1")
var obj = {
name : "张三",
[s1] : 40
}
console.log(obj[s1])
</script>
← 对象的扩展 Iterator(遍历器) →