[JavaScript] Symbol类型

Symbol([description])

新建一个原始值symboldescription是可选的,是一个string

(1)Symbol()并不创建全局符号,而是本地符号
而使用Symbol.forSymbol.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种原始值,stringnumberbooleannullundefinedsymbol(ES6),所有原始值都是不可变数据。
(2)除了nullundefined之外,所有的原始值具有相应的包装对象Object(v)/new Object(v)
(3)StringNumberBoolean可以使用相应的构造函数得到包装对象,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);

你可能感兴趣的:([JavaScript] Symbol类型)