Symbol

2016-11-10  本文已影响3人  songyaqi

什么是Symbol类型

Symbol是一种新的原始数据类型, 表示独一无二的值

解决痛点: 你使用了他人的一个对象, 但又想给这个对象添加新的方法(mixin模式), 新的方法的名字就有可能与现有的方法产生冲突. 如果有一种机制, 保证每个属性的名字都是独一无二的就好了, 这样就能从根本上防止属性名的冲突

使用方式

Symbol值通过Symbol函数生成. 这就是说, 对象的属性名现在可以有两种类型, 一种是原来的字符串, 另一种是现在新增的Symbol类型.凡是属性名属于Symbol类型都是独一无二的, 可以保证不会与其他属性的名称产生冲突.

let s = Symbol();

typeof s

作为属性名的Symbol

  1. Symbol值作为属性的时候, 不会被常规的方法遍历到, 所以为对象定义一些非私有的, 但又😟喜欢只用于内部的方法
  2. Symbol.forSymbol值登记的名字, 是全局环境的, 可以在不同的iframe或者service worker中取到同一个值
iframe = document.createElement('iframe');
iframe.src = String(window.location);
document.body.appendChild(iframe);

iframe.contentWindow.Symbol.for('foo') === Symbol.for('foo')

由于每一个Symbol值是不相等的, 这意味着Symbol值可以作为标识符(在编程语言中标识符是用户编程时使用的名字, 对于变量. 常量, 函数, 语句块也有名字, 我们统统称之为标识符), 用于对象的属性名, 就能保证不会出现同名的属性, 这对于一个对象由多个模块构成的情况非常有用, 能防止某一个键被不小心改写或者覆盖..

消除魔术字符串

魔术字符串指的是, 在代码之中多次出现, 与代码形成强耦合的某一个具体的字符串或者数值. 风格良好的代码, 应该尽量消除魔术字符串, 该由语义清晰的变量代替.

属性名的遍历

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

Symbol.for(), Symbol.keyFor()

有时候, 我们希望使用同一个Symbol的值, Symbol.for方法可以做到这一点.它接受一个字符串作为参数, 然后搜索有没有以该参数作为名称的Symbol值. 如果有, 就返回这个Symbol值, 否则就新建并返回一个以该字符串为名称的Symbol

var s1 = Symbol.for('foo');
var s2 = Symbol.for('foo');

s1 === s2 // true

Symbol.keyFor()

返回一个已经登记的Symbol类型值得key

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

var s2 = Symbol("foo");
Symbol.keyFor(s2) // undefined
上一篇 下一篇

猜你喜欢

热点阅读