ES6-symbol-创建symbol
// 1. ES 6 为引入 Symbol 类型?
// 为了确保每个属性的名称都是独一无二的,从根本上防止属性名的冲突。
// 引入 Symbol 类型之后,对象的属性名就有了两种类型,一种是 String 类型的数据,另一种就是 Symbol 类型的数据
// 2. 怎样创建 Symbol 类型的数据呢?
// 其他 5 种原始类型都有各自的字面量形式,而 Symbol 没有字面量形式,但是可以通过全局的 Symbol 函数创建一个 Symbol 类型的数据。
let firstName = Symbol();
let lastName = Symbol();
let obj = {};
obj[firstName] = '李金健';
console.log(obj)
console.log(obj[firstName])
console.log(obj[lastName])
// 上面的代码创建了一个名为 firstName 的 Symbol,用它作为 obj 对象的属性名,并为属性复制为 '李金健',
// 每当你想访问这个属性时一定要使用最初定义的 Symbol。
// 例如 obj[firstName] 可以访问到之前添加的属性值,而使用另外一个 Symbol 类型的值 lastName 就不能访问。
// 也就是说,你定义属性时使用的是哪个 Symbol,访问属性时也要使用使用哪个 Symbol。
// 3. Symbol 函数接收一个可选参数,它可以让你添加一段文本,描述即将创建的 Symbol,方便我们进行阅读和调试。
let firstName = Symbol('This is my first name');
let obj = {};
obj[firstName] = '刘逸云';
console.log(obj[firstName])
console.log(firstName)
// 4. 我们可以使用 typeof 操作符检测变量的值是否为 Symbol 类型。
let firstName = Symbol('This is my first name');
console.log(typeof firstName); // 'symbol'
// 5. Symbol 的使用场景
// 所有用到可计算属性名的地方,都可以用 Symbol。例如:
// 1> 对象字面量的可计算属性名中
let firstName = Symbol('This is my first name');
let obj = {
[firstName]: '王亚坡'
};
// 2> 在 Object.defineProperty() 方法中使用
let lastName = Symbol('This is my last name')
Object.defineProperty(obj, lastName, { value: '尼古拉斯' });
// 3> 在 Object.defineProperties() 方法中使用
let firstName = Symbol('This is my first name');
let lastName = Symbol('This is my last name');
let obj = {};
Object.defineProperties(obj, {
[firstName]: {
value: '王亚坡',
writable: false
},
[lastName]: {
value: '尼古拉斯',
writable: false
}
})
console.log(obj[firstName])
console.log(obj[lastName])
console.log(obj)