一、定义
Symbol是一种新的原始数据类型,表示独一无二的值
二、生成Symbol
直接调用Symbol函数即可生成一个Symbol
例: var nameSymbol = Symbol()
Symbol函数可以接收一个字符串作为参数,表示对Symbol的描述
例: var nameSymbol = Symbol('name')
注:Symbol函数不能用new声明,否则会报错
三、Symbol作为属性
1、 可作为标识符,用于对象的属性名,防止某一个键被改写或覆盖
let mySymbol = Symbol()
//第一种写法
let a = {};
a[mySymbol] = 'hello'
//第二种写法
let a = {
[mySymbol] = 'hello';
}
//第三种写法
let a = {} ;
Object.defineProperty(a, mySymbol, {value: 'hello'})
//以上写法的结果为
a[mySymbol] // 'hello'
注: 1 ) Symbol作为书姓名,该属性不会出现在for...in...、for...of...循环中,也不会被。 Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回
2 )可利用Object.getOwnPropertySymbols方法获取制定对象的所有Symbol属性名
2、Symbol...for...
Symbol...for...会先检查给定的key是否已经存在(之前被用Symbol...for...定义过),若不存在,会创建一个新的全局的值,若存在,则返回已存在的值(不会产生一个新的)
3、Symbol的使用
1 )消除魔术字符串
2 )实现私有属性
var person = {function(){
var nameSymbol = Symbol('name');
function Person(name) {
this[nameSymbol] = name;
}
//getName方法返回私有属性值
Person.prototype.getName = function() {
return this[nameSymbol]
}
}}
缺点: 该方法仍然会被Object.getOwnPropertySymbols获取属性,进而修改对应的值