定义
- symbol 是一种基本数据类型 (primitive data type)。
- 使用Symbol() 函数返回(创建)symbol 类型的值。
- 每个从 Symbol() 返回的symbol值都是唯一的。
- 语法: Symbol([description]) 。
- Symbol 不能隐式转换为字符串,比如alert(Symbol()) 会产生错误
- 可以显示转换 Symbol('foo').toString()
示例
let sym1 = Symbol();
let sym2 = Symbol('foo');
let sym3 = Symbol('foo');
// Symbol 每次都会返回一个唯一值
Symbol("foo") === Symbol("foo"); // false
// 不需要使用 new 运算符
let sym = new Symbol(); // TypeError
应用场景1
Symbol 作为对象属性名不可枚举
let obj = {
[Symbol('name')]: '小花',
age: 18,
title: 'Engineer'
}
Object.keys(obj) // ['age', 'title']
for (let p in obj) {
console.log(p) // 分别会输出:'age' 和 'title'
}
Object.getOwnPropertyNames(obj) // ['age', 'title']
由上代码可知,Symbol类型的key是不能通过Object.keys()或者for...in来枚举的,它未被包含在对象自身的属性名集合(property names)之中。所以,利用该特性,我们可以把一些不需要对外操作和访问的属性使用Symbol来定义。
也正因为这样一个特性,当使用JSON.stringify()将对象转换成JSON字符串的时候,Symbol属性也会被排除在输出内容之外:
JSON.stringify(obj) // {"age":18,"title":"Engineer"}