es6学习之Symbol

一.Symbol

Symbol是JavaScript的新的一种基本数据类型,表示独一无二的值.
undefined,null,String,Number,Boolean,Object,Symbol

引入的原因是防止对象的属性或者方法被无意的覆盖

Symbol的声明

// 方式1,每次声明的都是独一无二的,没有登记机制

let s1 = Symbol('foo');
let s2 = Symbol('bar');

s1 // Symbol(foo)
s2 // Symbol(bar)

s1.toString() // "Symbol(foo)"
s2.toString() // "Symbol(bar)"

// 方式2,每次声明的都是登记为全局范围,重复声明会返回已经声明的Symbol,没有则创建之

let s1 = Symbol.for('foo');

Symbol.keyFor(someSymbol);返回一个已经登记的Symbol的key

let s1 = Symbol.for("foo");
Symbol.keyFor(s1) // "foo"

let s2 = Symbol("foo");
Symbol.keyFor(s2) // undefined

二.Symbol作为属性名

  • Symbol 值作为对象属性名时,不能用点运算符
  • 使用 Symbol 值定义属性时,Symbol 值必须放在方括号之中
let mySymbol = Symbol();

// 第一种写法
let a = {};
a[mySymbol] = 'Hello!';

// 第二种写法
let a = {
  [mySymbol]: 'Hello!'
};

// 第三种写法
let a = {};
Object.defineProperty(a, mySymbol, { value: 'Hello!' });

// 以上写法都得到同样结果
a[mySymbol] // "Hello!"

遍历属性名

在没有使用Symbol的情况下可以使用for…in , for…of , Object.keys() , Object.getOwnPropertyNames()方法
但是,使用了Symbol作为属性名,Object.getOwnPropertySymbols(obj)获取对象中使用Symbol作为属性名的数组

const obj = {};
let a = Symbol('a');
let b = Symbol('b');

obj[a] = 'Hello';
obj[b] = 'World';

const objectSymbols = Object.getOwnPropertySymbols(obj);

objectSymbols
// [Symbol(a), Symbol(b)]

Reflect.ownKeys返回对象的所有属性名,所有

三.内置Symbol值

http://es6.ruanyifeng.com/#docs/symbol#%E5%86%85%E7%BD%AE%E7%9A%84-Symbol-%E5%80%BC

四.Symbol的用处

1.消除魔术字符串

魔术字符串指的是,在代码之中多次出现、与代码形成强耦合的某一个具体的字符串或者数值。

function getArea(shape, options) {
  let area = 0;

  switch (shape) {
    case 'Triangle': // 魔术字符串
      area = .5 * options.width * options.height;
      break;
    /* ... more code ... */
  }

  return area;
}

getArea('Triangle', { width: 100, height: 100 }); // Triangle魔术字符串

解决

const shapeType = {
  triangle: Symbol()
};

function getArea(shape, options) {
  let area = 0;
  switch (shape) {
    case shapeType.triangle:
      area = .5 * options.width * options.height;
      break;
  }
  return area;
}

getArea(shapeType.triangle, { width: 100, height: 100 });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值