在学习JavaScript的数据类型的时候,比较陌生的是Map和Set。[Map和Set是JavaScript的数据类型]
Map
在学习Map的时候,你可以把Map类比为OC里面的Dictionary。在Javascript中,默认的对象表示方式是在"{""}"中存储键值对,比方说{"name":"wu","age":23},但是对象里面的Key必须是字符串,这使得其有了局限性,因为数字(比如学号)等其他数据类型也应该可以作为对象的Key。所以在ES6规范中引入了Map。[并不是所有的浏览器都支持ES6]
eg:
var m = new Map([["JayZhou,37"],["AndyLiu,56"]]);
m.get("JayZhou"); //-->37
初始化Map需要一个二维数组,这与OC里面Dictionary的初始化是有区别的,但是二者的功用差不多
下面是申明一个空的Map,再对其进行操作:
var m = new Map();
m.set(37,"me"); //添加一个键值对
m.get(37); <span style="white-space:pre"> </span>//-->"me"
m.has("AndyLiu"); //判断该Map里面是否包含键"AndyLiu" flase
m.delete("JayZhou"); //删除
Set
Set和Map类似,也是一组集合,但是Set不存储Value。并且Set中不应该出现重复的Key。
eg:
var set1 = new Set(); //空的Set
s.add(2); //添加Key 2
s.add(3); //添加Key 3
s.add("2"); //添加Key "2"
s.add(2); //添加Key 2 无效果 s{2,3,"2"}
var set2 = new Set([1,2,3]);
s.add(2);
s.delete(2);
iterable
for...of
就像OC里面array、set、dictionary统称集合一样,JavaScript里面Map、Set、Array都属于iterable类型。iterable类型统一用for...of循环遍历,Array可以采用下标遍历。
for...of是ES6引入的,并不是所有的浏览器都支持。[为啥不用for...in遍历,for...in遍历的是对象的属性名称,for...of遍历的是遍历的是集合本身的元素]
eg:
var map1 = new Map([["name","wu"],["age",23]]);
for (var x of map1) { //遍历map1,map1是2维数组,x为数组
alert(x[0]); //x[0]为key,x[1]为value
}
var array1 = ["name",23,"age"];
array1.great = 3; //数组实际也是一个对象,为array1添加一个新属性
for (var x of array1) { //遍历array1,array1是1维数组
alert(x); //x分别为"name"、23、"age"
}
for (var x in array1) {
alert(x); //x分别为"name"、23、"age"、3
}
forEach
iterable内置的方法,参数为一个函数,forEach其实是一个高阶函数,对iterable进行遍历
eg:
var array1 = ["1","2"];
array1.forEach(function (element,index,array){
alert(element); //当前的元素"1","2"
alert(index); //当前的索引0,1
alert(array); //自身
});
var set1 = new Set([1,2]);
set1.forEach(function (element,sameElement,set){
alert(element); //当前的元素
alert(sameElement); //当前的元素,set是没有index的
alert(set); //自身
});
var map1 = new Map([["name","wu"],["age",23]]);
map1.forEach(function (value,key,map){
alert(value); //当前的键值"wu",23
alert(key); //当前的键"name","age"
alert(map); //自身
});
forEach里面的function的参数可以省略你不想要的。