symbol是JavaScript第7种数据类型(新增的),只作为名称的属性,不会被常规方法遍历,所以可以为对象定义一些非私有的、但又希望只用于内部的方法。
let s = symbol()/symbol('foo');
- 定义symbol的时候,括号里的字符串是对当前变量的描述。
用法
let a = {
[mySymbol]: 'hello'
}
或者
var a = {};
a[mySymbol] = 'Hello!';
但是不能这样写
a['mySymbol'] = 'hello'; //不是symbol变量
相当于
let a = {
mySymbol: 'hello' // 熟悉感来了
}
- a['mySymbol']=a.mySymbol 不等于 a[mySymbol]。
在哪里用比较好?
symbol可以把强耦合变成弱耦合,利于修改和维护。
// 强耦合
function getArea(shape, options) {
var area = 0;
switch (shape) {
case 'Triangle': // 魔术字符串
area = .5 * options.width * options.height;
break;
/* ... more code ... */
}
return area;
}
// 弱耦合
var shapeType = {
triangle: 'Triangle'
};
function getArea2(shape, options) {
var area = 0;
switch (shape) {
case shapeType.triangle:
area = .5 * options.width * options.height;
break;
}
return area;
}
getArea('Triangle', { width: 100, height: 100 });
getArea2(shapeType.triangle, { width: 100, height: 100 });
在项目中可以使用symbol.for()和symbol.keyFor()
// mod.js
const FOO_KEY = Symbol.for('foo');
function A() {
this.foo = 'hello';
}
if (!global[FOO_KEY]) {
global[FOO_KEY] = new A();
}
module.exports = global[FOO_KEY];
上面代码中,可以保证global[FOO_KEY]不会被无意间覆盖,
但还是可以被改写。
var a = require('./mod.js');
global[Symbol.for('foo')] = 123;
我想我会用到的symbol用法就是这些。给自己记个笔记,下次还可以复习。