多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[toc] ## 数组的扩展 ### Array.from() Array.from()将类数组括可迭代对象(包括set和map)转为真正的数组 ``` let arrayLike={ "0":"a", "1":"b", "2":"c", length:3 } ES5: var arr1 = [].slice.call(arrayLike); //["a","b","c"] ES6: var arr2 = Array.from(arrayLike); //["a","b","c"] ``` Array.from()还接受第二个参数,第二个参数是一个方法,类似map一样对每个元素进行处理: ``` Array.from([1,2,3],x=>x*x); //[1,4,9] ``` ### Array.of() Array.of()用于将一组值转换为数组 ``` Array.of(3,11,8); //[3,11,8] ``` ### 数组实例的copyWithin() copyWithin()方法用以将指定位置的成员负值到其他位置,覆盖目标位置的值,会修改原数组 Array.prototype.copyWithin(target,source=0,end=this.length): - target,必须,目标位置 - start,可选,从该位置开始读取 - end,可选,到当前位置结束,默认等于数组的长度 ``` [1,2,3,4,5].copyWithin(0,3); //原数组变为[4,2,3,4,5] ``` ### 数组实例的find()和findIndex() - find()方法用来找出第一个符合条件的数组成员 - findIndex()用来找出第一个符合条件的成员索引 ``` [1,5,10,15].find(function(value,index,arr){ return value>9; }); //10 [1,5,10,15].findIndex(function(value,index,arr){ return value>9; }); //2 ``` ### 数组实例的fill() 使用给定的值填充数组,初始化数组时很方便 ``` ["a","b","c"].fill(7); //[7,7,7] new Array(3).fill(0); //[0,0,0] ``` ### 数组实例的entries(),keys()和values() 都用于遍历数组,都返回一个遍历器对象。可以使用for...of循环 ``` for(let index of ["a","b"].keys(){ console.log(index); }) //0,1 for(let values of ["a","b"].values(){ console.log(values) }) //"a","b" for(let [index,value] of ["a","b"].entries(){ console.log(index+" "+value); }) //"0 a","1 b" ``` ### 数组实例的includes()方法 是否包含某个值,可以指定第二个参数用以表示开始搜索的位置 ## 对象的扩展 ### 属性的简洁表达 ``` var foo = "bar"; var baz = {foo}; //baz:{foo:"bar"} function f(x,y){ return {x,y} } 等价于: function f(x,y){ retrn {x:x,y:y} } var o = { method(){ return "hello" } } 等价于: var o = { method function(){ reutrn "hello" } } ``` CommonJS规范的简写: ``` var ms{}; function f1(key){ return key in ms?ms[key]:null } function f2(key,value){ ms[key] = value } function f3(){ ms = {}; } modules.exports = {f1,f2,f3} 等价于: modules.exports = { f1:f1, f2:f2, f3:f3 } ``` ### 属性名表达式 ES6允许将表达式作为属性名: ``` let propKey = "foo"; let obj={ [propKey]:"true", ["a"+"bc"]:123 } //obj:{foo:true,"abc":123} ``` ### 方法的name属性 函数的name属性返回函数名 ``` var p ={ sayHi:function(){ console.log("hi"); } } p.sayHi.name; //sayHi ``` ### Object.is() 用来比较两个值是否严格相等,与严格比较符(===)基本一致 ### Object.assign() Object.assign(target,source1,source2,...)将源对象的所有可枚举属性复制到目标对象 如果源对象与目标对象有相同的属性,或者多个源对象有相同的属性,则后面的覆盖前面的。 对于嵌套的对象,Object.assign会直接替换: ``` var target = { a:{ b:"c", d:"e" } } var source = { a:{ b:"hello" } } Object.assign(target,source); //{a:{b:"hello"}} ``` Object.assign方法可以用来为对象添加属性和方法,也可以用来克隆对象和合并多个对象 ### 属性的可枚举性 每个属性都有一个属性描述符(Descriptor)用以控制该属性的行为,可以使用Object.getOwnPropertyDescriptor()来获取对象的描述。 ES5中有以下3个方法会忽略enumerable为false的属性: - for...in - Object.keys() - JSON.stringify() ES6新增了两个操作,也会忽略enumerable为false的属性: - Object.assign() - Reflect.enumerable():返回所有for...in会遍历到的属性 ### 属性的遍历 ES6有6种方法可以遍历属性: - for...in - Object.keys(obj) - Object.getOwnPropertyNames(obj) - Object.getOwnPropertySymbols(obj) - Reflect.ownKeys(obj) - Reflect.enumerable(obj) ### __proto__属性,Object.setPropertyOf(),Object.getPrototypeOf() __proto__属性用来读取或设置对象的prototype对象 Object.setPropertyOf()用来设置属性的prototype对象 Object.getPropertyOf()用来获取属性的prototype对象