Skip to content

Commit f05acc0

Browse files
committed
edit symbol/magic string
1 parent 8afab8c commit f05acc0

File tree

1 file changed

+55
-0
lines changed

1 file changed

+55
-0
lines changed

docs/symbol.md

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,61 @@ function getComplement(color) {
182182

183183
还有一点需要注意,Symbol值作为属性名时,该属性还是公开属性,不是私有属性。
184184

185+
## 实例:消除魔术字符串
186+
187+
魔术字符串指的是,在代码之中多次出现、与代码形成强耦合的某一个具体的字符串或者数值。风格良好的代码,应该尽量消除魔术字符串,该由含义清晰的变量代替。
188+
189+
```javascript
190+
function getArea(shape, options) {
191+
var area = 0;
192+
193+
switch (shape) {
194+
case 'Triangle': // 魔术字符串
195+
area = .5 * options.width * options.height;
196+
break;
197+
/* ... more code ... */
198+
}
199+
200+
return area;
201+
}
202+
203+
getArea('Triangle', { width: 100, height: 100 }); // 魔术字符串
204+
```
205+
206+
上面代码中,字符串“Triangle”就是一个魔术字符串。它多次出现,与代码形成“强耦合”,不利于将来的修改和维护。
207+
208+
常用的消除魔术字符串的方法,就是把它写成一个变量。
209+
210+
```javascript
211+
var shapeType = {
212+
triangle: 'Triangle'
213+
};
214+
215+
function getArea(shape, options) {
216+
var area = 0;
217+
switch (shape) {
218+
case shapeType.triangle:
219+
area = .5 * options.width * options.height;
220+
break;
221+
}
222+
return area;
223+
}
224+
225+
getArea(shapeType.triangle, { width: 100, height: 100 });
226+
```
227+
228+
上面代码中,我们把“Triangle”写成`shapeType`对象的`triangle`属性,这样就消除了强耦合。
229+
230+
如果仔细分析,可以发现`shapeType.triangle`等于哪个值并不重要,只要确保不会跟其他`shapeType`属性的值冲突即可。因此,这里就很适合改用Symbol值。
231+
232+
```javascript
233+
const shapeType = {
234+
triangle: Symbol()
235+
};
236+
```
237+
238+
上面代码中,除了将`shapeType.triangle`的值设为一个Symbol,其他地方都不用修改。
239+
185240
## 属性名的遍历
186241

187242
Symbol作为属性名,该属性不会出现在`for...in``for...of`循环中,也不会被`Object.keys()``Object.getOwnPropertyNames()`返回。但是,它也不是私有属性,有一个`Object.getOwnPropertySymbols`方法,可以获取指定对象的所有Symbol属性名。

0 commit comments

Comments
 (0)