Symbol([description])
新建一个原始值symbol
,description
是可选的,是一个string
。
(1)Symbol()
并不创建全局符号,而是本地符号。
而使用Symbol.for
和Symbol.keyFor
用来设置和检索全局符号
var sym1=Symbol.for('foo');
var sym2=Symbol.for('foo');
console.assert(sym1===sym2);
(2)每次调用Symbol('foo')
会创建新的本地符号
var sym1=Symbol();
var sym2=Symbol('foo');
var sym3=Symbol('foo');
console.assert(sym2!==sym3);
console.assert(typeof sym1==='symbol');
(3)new Symbol
会产生异常
var sym=new Symbol(); //TypeError
(4)本地符号可以作为对象属性名
var sym=Symbol('a');
var obj={[sym]:1,'foo':2};
console.assert(obj[sym]===1);
console.assert(obj['foo']===2);
(5)for...in并不会遍历对象的符号属性,即使用Object.defineProperty
设置enumerable:true
也不行。而是使用Object.getOwnPropertySymbols(obj)
得到给定对象的符号属性数组。
(6)内置的本地符号
console.assert(typeof Symbol.iterator==='symbol');
注:
(1)原始值是JavaScript中不是对象也没有方法的数据。
共有6种原始值,string
,number
,boolean
,null
,undefined
,symbol
(ES6),所有原始值都是不可变数据。
(2)除了null
和undefined
之外,所有的原始值具有相应的包装对象Object(v)
/new Object(v)
。
(3)String
,Number
,Boolean
可以使用相应的构造函数得到包装对象,new String('a')
,new Number(1)
,new Boolean(true)
。
(4)String('a')
,Number(1)
,Boolean(true)
并不是包装对象,而是进行类型转换,返回一个原始值。
(5)new Symbol
会抛出异常,只能使用Object(symbol)
/new Object(symbol)
来创建symbol
的包装对象。结果是Symbol对象的实例Object(symbol) instanceof Symbol === true
,当然也是Object对象的实例。
(6)包装对象的valueOf
方法可以返回其中的原始值。
(7)Symbol.for(str)
查找全局符号表,如果没有就创建一个符号,Symbol.keyFor(sym)
查找对应于全局符号的key
。
(8)Symbol.keyFor(sym)
可用于判断一个符号是全局符号还是本地符号,对于本地符号返回undefined
,而对于全局符号,返回该符号的key
。
var globalSym = Symbol.for("foo"); // create a new global symbol
Symbol.keyFor(globalSym); // "foo"
var localSym = Symbol();
Symbol.keyFor(localSym); // undefined
// well-known symbols are not symbols registered
// in the global symbol registry
Symbol.keyFor(Symbol.iterator) // undefined
(8)原始值也是有__proto__
的
var a=1;
console.assert(a.__proto__===Number.prototype);
网友评论