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