1
0
mirror of https://github.com/ruanyf/es6tutorial.git synced 2025-05-28 21:32:20 +00:00

edit symbol/magic string

This commit is contained in:
ruanyf 2015-11-16 15:56:15 +08:00
parent 8afab8ca89
commit f05acc0c84

View File

@ -182,6 +182,61 @@ function getComplement(color) {
还有一点需要注意Symbol值作为属性名时该属性还是公开属性不是私有属性。
## 实例:消除魔术字符串
魔术字符串指的是,在代码之中多次出现、与代码形成强耦合的某一个具体的字符串或者数值。风格良好的代码,应该尽量消除魔术字符串,该由含义清晰的变量代替。
```javascript
function getArea(shape, options) {
var area = 0;
switch (shape) {
case 'Triangle': // 魔术字符串
area = .5 * options.width * options.height;
break;
/* ... more code ... */
}
return area;
}
getArea('Triangle', { width: 100, height: 100 }); // 魔术字符串
```
上面代码中字符串“Triangle”就是一个魔术字符串。它多次出现与代码形成“强耦合”不利于将来的修改和维护。
常用的消除魔术字符串的方法,就是把它写成一个变量。
```javascript
var shapeType = {
triangle: 'Triangle'
};
function getArea(shape, options) {
var area = 0;
switch (shape) {
case shapeType.triangle:
area = .5 * options.width * options.height;
break;
}
return area;
}
getArea(shapeType.triangle, { width: 100, height: 100 });
```
上面代码中我们把“Triangle”写成`shapeType`对象的`triangle`属性,这样就消除了强耦合。
如果仔细分析,可以发现`shapeType.triangle`等于哪个值并不重要,只要确保不会跟其他`shapeType`属性的值冲突即可。因此这里就很适合改用Symbol值。
```javascript
const shapeType = {
triangle: Symbol()
};
```
上面代码中,除了将`shapeType.triangle`的值设为一个Symbol其他地方都不用修改。
## 属性名的遍历
Symbol作为属性名该属性不会出现在`for...in``for...of`循环中,也不会被`Object.keys()``Object.getOwnPropertyNames()`返回。但是,它也不是私有属性,有一个`Object.getOwnPropertySymbols`方法可以获取指定对象的所有Symbol属性名。