javascript Object "Symbol type" - archering/basic GitHub Wiki

object 对象的key 只允许两种类型,一种是string 另一种叫Synbol类型。 其他类型的key都会隐式的被转成string。

参看这篇文章 http://javascript.info/symbol

创建一个Symbol


var id = Symbol();
var id2 = Symbol("id");//参数是描述

需要特别指出的是,Symbol 是唯一的,任何两个symbol (即便表述是一样的)也是不相等。


var id1 = Symbol("id");
var id2 = Symbol("id");
id1 == id2  // false

Object 中设置 symbol 属性 ; for…in 无法遍历出 symbol 作为key的属性,利用这种方式可以隐藏

let id = Symbol("id");

let user = {
  name: "John",
  [id]: 123 // not just "id: 123"
};

Object.assign 可以copy 或者合并 symbol的属性

let id = Symbol("id");
let user = {
  [id]: 123
};

let clone = Object.assign({}, user);

alert( clone[id] ); // 123

所有在程序中 出现的 symbol 都会注册到一个叫 Symbol的全局对象中。

这里需要注意,要想通过 Symbol.for() 找到相应的实例,需要通过Symbol.for("miaoshu") 去定义变量; 通过构造函数 var a = Symbol("a") 是不能通过 Symbol.for("a") 回朔到的,只会新创建一个 同名描述的 symbol实例; Symbol.for 这种方式叫 global symbol registry

retrival 一个symbol : 通过描述查找symbol

let id = Symbol.for("id"); //  查找整个id的symbol,没有就会创建一个
var user = {
   [id]:"zhang"
}

user[id] //读出整个值

通过symbol实例对象找到 描述

var sy = Symbol.for("name123");

Symbol.keyFor(sy);// name123