JavaScript入门学习

《JavaScript入门学习》之Symbol类型

2017-10-16  本文已影响27人  Johankoi

简介

ES6之前JS有6种基本的数据类型:null,undefined,boolean,number,string,object(array,function也属于object)。
ES6新加了Symbol类型:

console.log(typeof Symbol());  // symbol

Symbol可当做构造函数,可接受一个字符串作为参数,表示对Symbol实例的描述,在控制台显示,或转为字符串时,作为区分:

let sym1 = Symbol('sym1');
let sym2 = Symbol('sym2');

console.log(sym1);   // Symbol(sym1)
console.log(sym2);   // Symbol(sym2)

console.log(sym1.toString());   // Symbol(sym1)
console.log(sym2.toString());   // Symbol(sym2)

该数据类型存在的主要用途是解决属性名重复冲突的问题,因为Symbol的实例化过程具有唯一性

//调用无参构造函数创建两个Symbol对象
let sym3 = Symbol();
let sym4 = Symbol();
console.log(sym3 !== sym4);  // true

//都传入同样描述参数创建两个Symbol对象
let sym3 = Symbol('id');
let sym4 = Symbol('id');
console.log(sym3 !== sym4);  // true

与js对象之间的关系:

看一个小例子:

let s = Symbol('id');
let obj = {
   a :'a',
  [s]:'hello Symbol'
};
console.log(obj);  // { a: 'a', [Symbol(id)]: 'hello Symbol' }
console.log(obj.s); // undefined
console.log(obj[s]); // hello Symbol

看得出Symbol这个玩意儿可以鼓捣为声明一个对象成员属性的key来用。为了显示自己的独特,声明的时候
要用[]括起来
,而且对象访问的时候不能用点语法获取,也是需要用[]获取,乍一看似乎把obj搞成array了。
我们可以把这种称作symbol-keyed属性(使用symbol作为键的属性)。

既然这种symbol-keyed属性很特殊,那必有它任性之处:
因为symbol键值是被设计来避免冲突的,正常情况下检测js对象的时候会忽略symbol-keyed属性。以for-in循环为例,循环只会遍历对象的字符串类型的键,Symbol键直接被忽略:

let s = Symbol('id');

let obj = {
   a :'a',
   b :'b',
  [s]:'hello Symbol'
};

for (key in obj) {
  console.log(`key:${key},value:${obj[key]}`);
}

打印结果:
key:a,value:a
key:b,value:b

Object.keys(obj)和 Object.getOwnPropertyNames(obj) 同样会忽略:

console.log(Object.keys(obj));  // [ 'a', 'b' ]
console.log(Object.getOwnPropertyNames(obj));  // [ 'a', 'b' ]

但可以使用Object.getOwnPropertySymbols(obj)获取对象所有symbol键;Reflect.ownKeys(obj)将会同时返回string和symbol类型的键,这里不再举例。

上一篇 下一篇

猜你喜欢

热点阅读