From f05acc0c84ff5e42e1ac43cf0bd0880ba06b1c76 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Mon, 16 Nov 2015 15:56:15 +0800 Subject: [PATCH] edit symbol/magic string --- docs/symbol.md | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/docs/symbol.md b/docs/symbol.md index 5fcee3a..191f251 100644 --- a/docs/symbol.md +++ b/docs/symbol.md @@ -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属性名。