symbol是什么,怎么用,用在哪里?

448 阅读1分钟

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用法就是这些。给自己记个笔记,下次还可以复习。