JavaScript中的数据结构有四种:
- 数组(也是对象)
- 对象
- Map(ES6新增)
- Set(ES6新增)
数组和对象大家应该很熟悉了,下面介绍一下Map和Set。
Map
学过Java的同学应该很清楚(我怎么感觉JavaScript越来越像Java了。。。)
定义一个Map:
var map = new Map([["a",1],["b",2]]); //二维数组
map.set("c",3); //增加元素
map.delete("c"); //删除元素
map.set("b",3); //修改元素
map.set("b",4); //覆盖前面的3
map.get("b"); //4,根据键查找值
map.has("a"); //true,是否存在键"a"
或者
var map = new Map(); //空
map.set("a",1);
Set
只存储键,键不能重复。
定义一个Set:
var set = new Set(); //空
或者
var set = new Set([1,2,3]); //一维数组
set.add(4); //set {1, 2, 3, 4},添加元素
set.add(4); //set {1, 2, 3, 4},重复添加,无效果
set.delete(4); //set {1, 2, 3},删除元素
set.add("1"); //set {1, 2, 3, "1"},1和"1"不一样
遍历
Array、Map、Set都属于ES6新引入的iterable类型。可以通过ES6新引入的for..of语法遍历。
var arr = ['A', 'B', 'C'];
var set = new Set(['A', 'B', 'C']);
var map = new Map([[1, 'a'], [2, 'b'], [3, 'c']]);
for(var v of arr) {
console.log(v); //A,B,C
}
for(var v of set) {
console.log(v); //A,B,C
}
for(var v of map) {
console.log(v);
//[1, "a"]
//[2, "b"]
//[3, "c"]
}
有同学可能疑问了,对象不能用for..of吗?试一下:
var obj = {"a":1, "b":2, "c":3};
for(var v of obj) {
console.log(v); //TypeError
}
不行哦!为什么呢?因为对象没有内置迭代器。for..of循环首先会向被访问的对象请求一个迭代器对象,然后调用迭代器对象的next()方法来遍历所有返回值。
当然,我们也可以给对象定义迭代器,让它可以利用for..of遍历。
var myObject = {
a: 2,
b: 3
};
Object.defineProperty( myObject, Symbol.iterator, {
enumerable: false,
writable: false,
configurable: true,
value: function() {
var o = this;
var idx = 0;
var ks = Object.keys( o );
return {
next: function() {
return {
value: o[ks[idx++]],
done: (idx > ks.length)
};
}
};
}
} );
for (var v of myObject) {
console.log( v ); //2,3
}