ES6 引入了一种新的原始数据类型 Symbol,表示独一无二的值。是JavaScript第7种原始数据类型。前6种是:undefined,Null,Boolean,String,Number,Object。javascript
Symbol值,经过Symbol函数生成。也就是说,对象的属性名如今有两种类型,一种是原来就有的字符串,另外一种就是新增的Symbol类型。只要属性名属于Symbol类型,就是独一无二的,能够保证不会与其余属性名产生冲突。java
let s = Symbol();
typeof s // symbol
复制代码
Symbol 函数钱不能使用 new ,Symbol不是对象,因此,也不能添加属性。基本上,他是一种相似于字符串的数据类型。数组
因为每个Symbol值都是不想等的,这意味着Symbol值能够做为标识符用于对象的属性名,保证不会出现同名属性。对于一个对象由多个模块构成的状况很是有用,能防止某一个键被不当心修改或者覆盖。函数
var mySymbol = Symbol();
// 第一种写法
var a = {};
a[mySymbol] = 'Hello';
// 第二种写法
var a = {
[mySymbol]:'Hello';
}
// 第三种写法
var a = {};
Object.defineProperty(a,mySymbol,{value:'Hello'});
复制代码
在对象内部,使用Symbol值定义属性时,Symbol值必须放在方括号中。ui
function getArea(shape,options){
var area = 0;
switch (shape) {
case: 'Trangle'://魔术字符串
area = 0.5 * options.width * options.height;
break;
/* more */
}
return area;
}
getArea('Trangle', {width:100,height:100}); //魔术字符串
复制代码
字符串 Trangle 就是一个 魔术字符串。屡次出现,与代码强耦合。不利于未来的修改和维护。spa
经常使用的消除魔术字符串的方法就是将其写成一个变量code
var shapeType = {
triangle: 'Trangle'
}
function getArea(shape,options){
var area = 0;
switch (shape) {
case: shapeType.trangle://魔术字符串
area = 0.5 * options.width * options.height;
break;
/* more */
}
return area;
}
getArea(shapeType.trangle, {width:100,height:100});
复制代码
Symbol 做为属性名,该属性不会出如今 for .. in , for ... of 循环中,也不会被 Object.keys(),Object.getOwnPropertyNames()返回。可是它也不是私有属性。有一个Object.getOwnPropertySymbols方法返回指定对象的全部symbol属性名,是一个数组,成员是当前对象全部用做属性名的Symbol值。对象