新增结构有:1、symbol,表示独一无二的值,是一个函数结构;2、set,指的是“集合”结构,类似数组,允许存放无序且不能重复的数据;3、weakset,类似set,内部数据也不能有重复值;4、map,指的是“字典”结构,可存储映射关系。
本教程操作环境:windows7系统、ecmascript 6版、dell g3电脑。
es6新增数据结构1、symbol
symbol是es6中新增的一个基本数据类型之一,它是一个函数。每一个从symbol函数返回的symbol值都是独一无二的,symbol值作为对象属性的标识符,也是唯一的用途的。
const s1 = symbol()const s2 = symbol()console.log(s1 === s2); // false
symbol作为key
第一种方式,直接在对象的字面量中添加。
// symbol作为keyconst obj = { [s1]:'abc', [s2]:'cc',}
第二种方式,通过添加数组方式添加。
// 需要用数组方式来获取,不能通过点语法,否则会获取到字符串keyconsole.log(obj[s1]);
第三种方式,通过对象中的defineproperty方法添加。
const s4=symbol()object.defineproperty(obj,s4,{ configurable:true, enumerable:true, writable:true, value:'ff'})
通过symbol获取对应的值
需要用数组方式来获取,不能通过点语法,否则会获取到字符串key。
console.log(obj[s1]);
symbol不能被隐式转换成string类型。
注意:symbol函数中的参数是symbol描述符,这是在es10新增的特性
let sym = symbol("sym")alert(sym) // typeerror: cannot convert a symbol value to a string
我们不能直接alert一个symbol对象,但是我们可以通过tostring的方式或者.description来获取symbol对象的描述符。
let sym = symbol('a')console.log(sym.description); // 'a'
遍历symbol
在使用for遍历、object.keys中是获取不到symbol健的,对此object还提供了getownpropertysymbols方法,用于获取对象中所有symbol的key。
const skeys=(object.getownpropertysymbols(obj));for(const skey of skeys){ console.log(obj[skey]);}
全局symbol对象注册
有时,我们可能需要多个symbol的值是一致的,我们可以通过symbol提供的静态方法for方法传入一样的描述符来使它们的值一致。
symbol.for
该方法会在使用给定键搜索运行时符号注册表中的现有符号,并在找到时返回它。否则,使用此键在全局符号注册表中创建一个新符号。
const sa=symbol.for('cc')const sb=symbol.for('cc')console.log(sa===sb); //true
symbol.keyfor
该方法用于获取全局symbol的描述符。
const key =symbol.keyfor(sb)console.log(key); // c
2、set
set对象(类似数组)允许你存放任何数据类型,但里面的值不能重复。
const s1 = new set()s1.add(10)s1.add(20)s1.add(30)s1.add(40)console.log(s1) // set(4) { 10, 20, 30, 40 }s1.add(20)console.log(s1) // set(4) { 10, 20, 30, 40 }
set常用方法
方法返回值说明
size set对象中的数量 返回set对象中的数量
add set对象 添加元素
delete boolean 删除元素
has boolean set对象中是否存在这个值
clear 无 清空set对象中的值
3、weakset
weakset是类似set的另外一种数据结构,内部数据也不能有重复值。
它与set的区别weakset只能存放对象类型,不能存放基本数据类型weakset对元素是弱引用基本使用
const weakset = new weakset();let obj = { name: "_island"};weakset.add(obj);
weakset常用方法
方法返回值说明
add weakset对象 添加元素
delete boolean 删除元素
has boolean weakset对象中是否存在这个值
关于遍历
weakset不能被遍历,因为它只是对对象进行弱引用,如果遍历去获取元素,有可能导致对象不能被gc回收。
所以weakset中的对象是不能获取的
4、map
es6新增的数据结构,用于存储映射关系。我们知道在javascript中对象中是不能用对象来作为key的。(假如我们把对象作为key,其内部会将对象转换为字符串[object object])
const obj1 = { name: "_island" };const obj2 = { name: "qc2125" };const obj3={ [obj1]:'a', [obj2]:'b',}console.log(obj3);// { '[object object]': 'b' }
而map则可以把对象作为key进行存储,可以通过set方法添加到map中,也直接通过字面量的方式添加。
const obj1 = { name: "_island" };const obj2 = { name: "qc2125" };const map = new map();map.set(obj1, "a");map.set(obj2, "b");console.log(map); // map(2) { { name: '_island' } => 'a', { name: 'qc2125' } => 'b' }// orconst map2 = new map([[obj1,'a'],[obj2,'b']])
map常用方法
方法返回值说明
get 获取对应的元素 通过key获取对应元素
size map对象中的数量 返回map对象中的数量
set map对象 添加元素
delete boolean 删除元素
has boolean set对象中是否存在这个值
clear 无 清空set对象中的值
遍历map
通过foreach语句遍历map
map2.foreach((item) => console.log(item));
通过for..of遍历map
for ([val, key] of map2) { console.log(`${key}---${val}`);}
5、weakmap
和map类似,也是以键值对的形式存在的
和map的区别weakmap的key只能使用对象,不接受其他的类型作为keyweakmap的key对对象是弱引用基本使用
const weakmap = new weakmap();weakmap.set(obj, "a");console.log(weakmap.get(obj)); // a
weakmap常用方法
方法返回值说明
get weakmap对象 获取元素
delete boolean 删除元素
has boolean weaksmap对象中是否存在这个值
关于遍历
和weakset一样,正因为它是弱引用,weakmap的key是不可枚举的,如果key可枚举那其列表将会受gc影响。
【相关推荐:javascript视频教程、web前端】
以上就是新增的es6数据结构有哪些的详细内容。