JS对象

  • JS对象是一种集合数据类型,有若干的键值对组成,访问一个不存在的数据类型返回undefined,可以自由的添加删除属性,属性以‘,’结束,最后一个属性不用写‘,’

    var xiaoming = {
    name:'小明',
    age:18
    };
    xiaoming.school;//undefined
    xiaoming.school = 1;
    xiaoming.school;//返回1
    delete xiaoming.age; // 删除age属性
    xiaoming.age; // undefined
    //可以用in来检测相关属性
    'name' in xiaoming;//返回true
    //或者是用hasOwnProperty()
    xiaoming.hasOwnProperty('name');//true


JS的条件判断

  • 使用if() else()来进行判断,循环for(与java用法类似)或是for..in,for..of的用法(在后文会提到)和while

    var a = {
    name:'Jack',
    age:20,
    city:'BeiJing'
    };
    for(var key in a){
    console.log(key);//'name', 'age', 'city'
    }
    var array = [1,2,3];
    for(var i in array){
    console.log(i);//'0','1','2'
    console.log(array[i]);//1,2,3
    }


Map和Set

Map是一组键值对结构,查找速度较快.因为在JS对象中键的结构只能是String,所以在ES6中新引入了map

var m = new Map([['A',85],['B',75],['C',95]]);
m.get('A');//85
var a = new Map();//初始化一个空Map
a.set('A',85);//添加一个新的key-value
a.set('B',95);
a.has('A');//询问是否存在key‘A’:true
m.get('A');85,获得A的值
m.delete('A');删除‘A’的键值对

  • 一个key只能对应一个value,后来的value会替换当前的value
  • 看到一个很形象的比如,在讨论同样是为键值对类型的object和Map时,就像是唐伯虎点秋香里众多盖着盖头的姑娘,在object的情况需要一个一个去掀开盖头去访问,而在Map中则是大家直接以真面目示人,可以进行快速的查找。做出这个比喻的大神也真的很厉害了。
    从定义的角度来看,object中需要获取值是通过对象.属性来访问的,Map中则是通过get方法来访问内部的值。
  • Set 是一组key的集合,但不存储value,且key不会重复,如有重复的则会被自动过滤掉。要想创建一个Set需要提供一个array作为输入或者是直接初始化一个空Set

    var s1 = new Set();//初始化一个空Set
    var s2 = new Set([1,2,3]);
    s1.add(4);//将4添加到s1中
    s1.delete(4);//将4从s1当中删除


iterable类型

iterable:遍历Array可以采用下标循环,遍历Map和Set就无法使用下标。为了统一集合类型,ES6标准引入了新的iterable类型,Array、Map和Set都属于iterable类型。具有iterable类型的集合可以通过新的for ... of循环来遍历。

  • 首先还是需要注意for in和for of他的区别到底是什么:

1.for in遍历的其实是对象的属性名称。Array数组实际上也是一个对象,每一个元素的索引被视为一个属性。当我们手动给Array对象添加额外的属性后:

var a = ['A', 'B', 'C'];
a.name = 'Hello';
for (var x in a) {
console.log(x); // '0', '1', '2', 'name'
}
for in将name包含在其中,但是Array.length属性却不包括name。
ps:如果将这个a写出来不知道是什么样的,待我细细研究

2.for of只循环集合本身的元素

var a = ['A', 'B', 'C'];
a.name = 'Hello';
for (var x of a) {
console.log(x); // '0', '1', '2', 'name'
}

3.forEach方法:iterable内置forEach方法,他接受到一个函数,每次迭代就自动回调该函数。
同样是用上述array

var a = ['A','B','C'];
a.forEach(function(element,index,array){
//element:指向当前元素的值
//index:指向当前索引
//array:指向Array对象本身
console.log(element+',index='+index);
})
输出:A,index = 0 B,index = 1 C, index = 2

  • Set与Array类似,但Set没有索引,因此回调函数的前两个参数都是元素本身:

    var s = new Set(['A', 'B', 'C']);
    s.forEach(function (element, sameElement, set) {
    console.log(element);
    });

  • Map的回调函数参数依次为value、key和map本身:

    var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
    m.forEach(function (value, key, map) {
    console.log(value);
    });//输出x,y,z