1.对象(详见c08p205)适用于创建实例的应用程序之间存储和交换数据:显式构造函数字面量-->不会调用构造函数(代码越少,封装越多)功能:在大的情况下参数个数,适合使用:命名参数(必填)+对象字面量对多个(可选)参数的封装2.数组有序,大小动态2.1创建实例:constructorliteral-->不会调用构造方法from(类数组,(可选)映射函数,(可选)映射函数中this指定的对象)of()参数->Array2.2空元素:forEach(忽略),for(视为undefined),map(会被跳过不处理),join(被当成空字符串处理)ES6新方法将其视为undefined行为不一致,性能隐患2.3index相关:索引超过最大索引长度的处理不只读(可以是largerorsmaller)2.4检查是否为数组:Array.isArray(obj)兼容框架间不同版本的构造函数2.5迭代器方法:keys()、values()(默认)、entries()。2.6填充:fill(arg1,arg2,arg3)arg1:填充值copyWithin(arg1,arg2,arg3)arg1:填充索引arg2\arg3:开始和结束索引2.7ConverttoString()每个元素转换后,连接toLocaleString()valueOf()数组本身join(分隔符)2.8模拟数据结构栈后进先出:push(接收任意数量的参数,返回数组的最新长度),pop(返回栈元素)teamFIFO:push,shift(返回队列元素)反队列:unshift(接收任意个参数,返回数组的最新长度),pop2.9排序sort((a,b)=>{...})参数函数返回值1:ab需要交换,否则不需要。将更改数组本身reverse()将反转数组元素。更改数组本身。不够灵活,无法返回对调用它们的数组的引用。2.10在旧数组上新建数组concat(),可以传多个参数slice(起始索引,结束索引(不包含,可选))splice(起始索引,长度(>=0,可选)),N个插入元素(optional)):改变原数组,返回删除元素的数组2.11严格相等搜索(===)(要搜索的元素,可选起始搜索位置),严格相等断言函数:indexOf,lastIndexOf。返回要查找的元素在数组中的位置,或-1包括:返回一个布尔值。在ES7中添加。断言函数:find、findIndex。两者都从数组的最小索引开始。可选的第二个参数是指向指定断言函数内的this的指针。返回第一个匹配元素的元素/索引断言函数有3个参数:元素、索引和数组本身。返回值确定相应索引处的元素是否被视为匹配项。2.12Iterationevery((item,index,array)=>...),some((item,index,array)=>...):全部符合函数/部分符合函数filter(生成一个新的阵列):过滤器。某些东西是否应该包含在它返回的数组中。逐一迭代。相当于用for循环遍历数组map(新数组):map。适用于创建一个与原数组的元素一一对应的新数组。2.13归并reduce(fn(pre,cur,index,array),[prev])reduceRight返回运行到最后归并数的返回值consta=["foo","bar","baz","qux"];constaKeys=a.keys(),aValues=a.values(),aEntries=a.entries();console.log(a.values===a[Symbol.iterator]);//trueconsole.log(Array.from(aKeys));//[0,1,2,3]console.log(Array.from(aValues));//['foo','bar','baz','qux']console.log(Array.from(aEntries));//[[0,'foo'],[1,'bar'],[2,'baz'],[3,'qux']]for(const[idx,element]ofa.entries()){console.log(idx,element);}//0foo//1bar//2baz//3quxfor(consteofa){console.log(e);}//Array//copyWithinletints,reset=()=>ints=[0,1,2,3,4,5,6,7,8,9];reset();ints.copyWithin(5);console.log(ints);//[//0,1,2,3,4,//0,1,2,3,4//]reset();ints.copyWithin(0,5);console.log(ints);//[//5,6,7,8,9,//5,6,7,8,9//]reset();ints.copyWithin(4,0,3);console.log(ints);//[//0,1,2,3,0,//1,2,7,8,9//]reset();ints.copyWithin(2,0,6);console.log(ints);//[//0,1,0,1,2,//3,4,5,8,9//]reset();ints.copyWithin(-4,-7,-5);console.log(ints);//[//0,1,2,3,4,//5,3,4,8,9//]reset();//数组//emptyleta2=[1,2,未定义];a2。长度=4;a2[4]=空;a2。forEach(item=>console.log(item));//1//2//undefined//nullfor(leti=0;i(x.length||x)+y.length);constresultArray=newtypedArrayConstructor(numElements);让currentOffset=0;typedArray.forEach(x=>{resultArray.set(x,currentOffset);currentOffset+=x.length;});returnresultArray;}constconcatArray=typedArrayConcat(Int32Array,Int8Array.of(1,2,3),Int16Array.of(4,5,6),Float32Array.of(7,8,9));console.log(concatArray);//Int32Array(9)[//1,2,3,4,5,//6,7,8,9//]console.log(concatArrayinstanceofInt32Array);//true4.MapMap(iterablestructure)key可以是任何类型,(function也可以用)基本操作.set(key,valuee).get(key),.has(key).delete(key)(返回对应key是否有boolean值),.clear()(清除所有key-valuesYes)SameValueZerosize和orderedkey比较的问题:NaN和NaN,+0和-0Iterator方法:keys(),values(),entries()(default)和Object相比,Map内存利用率高,插入速度更快,更快删除对象查找更快(经过优化)constm1=newMap([["key1","value1"],["key2","value2"],["key3","value3"]]);控制台日志(m1);//Map(3){'key1'=>'value1','key2'=>'value2','key3'=>'value3'}console.log(m1.size);//3constm2=newMap({[Symbol.iterator]:function*(){yield["key1","value1"];yield["key2","value2"];yield["key3","value3"];}});控制台日志(m2);//Map(3){'key1'=>'value1','key2'=>'value2','key3'=>'value3'}console.log(m2.size);//3constm=newMap();console.log(m.has("firstName"));//falseconsole.log(m.get("firstName"));//undefinedconsole.log(m.size);//0m.set("名字","马特").set("lastName","Frisble");console.log(m.has("firstName"));//trueconsole.log(m.get("firstName"));//Mattconsole.log(m.size);//2m.delete("firstName");console.log(m.has("firstName"));//falseconsole.log(m.get("firstName"));//undefinedconsole.log(m.size);//1m.clear();console.log(m.has("firstName"));//falseconsole.log(m.has("lastName"));//falseconsole.log(m.size);//0console.log('order=========');console.log(m.entries===m[Symbol.iterator]);//truefor(letpairofm1.entries()){console.log(pair);}//['key1','value1']//['key2','value2']//['key3','value3']for(letpairofm1){console.log(pair);}//['key1','value1']//['key2','value2']//['key3','value3']console.log(...m1);//['key1','value1']['key2','value2']['key3','value3']m1.forEach((value,key)=>console.log(`${key}->${value}`));//key1->value1//key2->value2//key3->value35.WeakMap键只能是对象类型或子类型;无迭代(键不可迭代);有利于垃圾回收(key被回收,别处没有引用);使用场景:1)(伪)私有变量2)DOM元素映射(不影响垃圾回收)constwm=newWeakMap();classUser{constructor(id){this.idProperty=Symbol('id');这个.setId(id);console.log('constructor')}setId(id){this.setPrivateProperty(this.idProperty,id);}setPrivateProperty(property,value){constprivateMembers=wm.get(this)||{};privateMembers[属性]=值;如果(!wm.get(this))wm.set(this,privateMembers);}getId(){返回这个。getPrivateProperty(this.idProperty);}getPrivateProperty(property){returnwm.get(this)[property];}}constuser=newUser(123);console.log(user.getId());//123用户。设置标识(456);console.log(user.getId());//456console.log(wm.get(user)[user.idProperty]);//456constPackedUser=(()=>{constwm=newWeakMap();classPackedUser{constructor(id){this.idProperty=Symbol('id');这个.setId(id);}setId(id){this.setPrivateProperty(this.idProperty,id);}setPrivateProperty(property,value){constprivateMembers=wm.get(this)||{};privateMembers[属性]=值;如果(!wm.get(this))wm.set(this,privateMembers);}getId(){返回this.getPrivateProperty(this.idProperty);}getPrivateProperty(property){returnwm.get(this)[property];}}returnPackedUser;})();constpackedUser=newPackedUser(123);console.log(packedUser.getId());//1236.SetSet(iterableobject)不重复value基本操作add(value)has(value)delete(value)(返回对应value是否有boolean值),clear()清除setsize迭代器method:keys(),values()(default),entries()extendSet实现交、并、差、对称差、笛卡尔积、幂集classXSetextendsSet{union(...sets){returnXSet.联合(这,...套);}intersection(...sets){returnXSet.intersection(this,...sets);}不同nce(set){returnXSet.difference(this,set);}symmetricDifference(set){returnXSet.symmetricDifference(this,set);}cartesianProduct(set){returnXSet.cartesianProduct(this,set);}powerSet(){返回XSet.powerSet(this);}//返回两个或多个集合的并集staticunion(a,...bSets){constunionSet=newXSet(a);for(constbofbSets){for(constbValueofb){unionSet.add(bValue);}}返回unionSet;}//返回两个或多个集合的交集staticintersection(a,...bSets){constintersectionSet=newXSet(a);for(constaValueofintersectionSet){for(constbofbSets){if(!b.has(aValue)){intersectionSet.delete(aValue);}}}返回交集集;}//返回两个集合差集a-bstaticdifference(a,b){constdifferenceSet=newXSet(a);for(constbValueofb){if(a.has(bValue)){differenceSet.delete(bValue);}}返回差异集;}//返回两个集合(a-b)+(b-a)的对称差集|a和b的并集-a和b的交集staticsymmetricDifference(a,b){returna.union(b).difference(a.intersection(b));}//返回两个集合的笛卡尔积(以一对数组的形式)//必须返回一个数组集合,因为笛卡尔积可能包含相同的值staticcartesianProduct(a,b){constcartesianProductSet=newXSet();for(constaValueofa){for(constbValueofb){car??tesianProductSet.add([aValue,bValue]);}}返回笛卡尔产品集;}//返回集合的幂集staticpowerSet(a){constpowerSet=newXSet().add(newXSet());for(constaValueofa){for(constsetofnewXSet(powerSet)){powerSet.add(newXSet(set).add(aValue));}}返回功率集;}}letxSet=newXSet().add(1);console.log(xSet.powerSet());//XSet(2)[Set]{XSet(0)[Set]{},XSet(1)[Set]{1}}xSet.add(2);console.log(xSet.powerSet());//XSet(4)[Set]{//XSet(0)[Set]{},//XSet(1)[Set]{1},//XSet(1)[Set]{2},//XSet(2)[Set]{1,2}//}7.WeakSet值只能是对象类型或子类型无迭代(值不可迭代)使用垃圾收集场景:1)DOM元素收集:DOM元素从页面中删除(且没有其他引用)可以被回收8.迭代和扩展有默认的迭代器类型:values():Array,stereotypedarray,Setentries()-自动调用Map的地方:for-of循环,扩展操作符