数组的创建
几种创建数组的方法
1. let a1 = new Array();
2. let a1 = Array();//与第一种方式等价
3. let a1 = Array.from(obj); //ES6
4. let a1 = Array.of(); //ES6
1,2两种方法创建数组,如果传入的参数是数字,表示新创建的数组的长度,而不是数组的元素。of方法解决1,2两种方法的歧义,数字代表的是数组的元素。
Array.from方法用于将类数组结构转换为数组实例,Array.of方法用于将一组参数转换为数组实例。
Array.from()第一个参数是一个可迭代的类数组对象,或者有一个length属性的可索引元素结构。
Array.from("Polo"); //['P', 'o', 'l', 'o']
const m = new Map().set(1,2).set(3,4);
const s = new Set().add(1).add(2).add(3).add(4);
Array.from(m); //[[1,2],[3,4]]
Array.from(s); //[1,2,3,4]
Array.from()可接收第二个可选映射函数参数,这个函数可以直接增强新数组的值,也就是说可以对第一个参数里的值做处理,新建数组的值为经过第二个参数函数加工的值。
const a2 = Array.from([1,2,3,4], x => x * 2); //[2,4,6,8]
Array.from()还可以接收第三个可选参数,用于指定映射函数中this的值,但这个重写的this值在箭头函数中不适用。
const a3 = Array.from([1,2,3,4],function(x){return x**this.exponent},{exponent:2}); //[1,4,9,16]
数组length属性
数组的length属性不是只读的,通过修改length属性,可以从数组末尾删除或添加元素。
let colors = ['red', 'blue', 'green'];
colors.length=4;//数组末尾增加一个元素,值为undefined
colors[99] = 'black';//数组长度变为100,3-98位置的元素值为undefined
检查是否为数组
ES6之前的版本,检查数组用各类方式,各有各的道理,也有各自的问题。ES6提供了Array.isArray方法,确定一个值是否为数组。
if (Array.isArray(value)) {
//操作数组
}
数组迭代方法
1. keys() //返回数组索引的迭代器
2. values() //返回数组元素的迭代器
3. entries() //返回索引/值对的迭代器
4. for(const [index,element] of a.entries()) //ES6解构语法在循环中拆分键值对
复制和填充
Array.copyWithin(): 按照指定范围浅复制数组中的部分内容,然后将他们插入到指定索引开始的位置。第1个参数表示插入位置的索引,第2个可选参数表示开始复制的索引位置。
let ints;
reset = () => ints = [0,1,2,3,4,5,6,7,8,9];
reset();
ints.copyWithin(5); //[0,1,2,3,4,0,1,2,3,4]
reset();
ints.copyWithin(0,5); [5,6,7,8,9,5,6,7,8,9]
reset();
ints.copyWithin(4,0,3); //[0,1,2,3,0,1,2,7,8,9]
Array.fill():第1个参数,表示用于填充的元素,第2个可选参数,表示填充的开始位置,第3个可选参数,表示填充的结束位置。fill()静默忽略超出数组边界,零长度及方向相反的索引范围。
const zeroes = [0, 0, 0, 0, 0];
zeroes.fill(5); //[5,5,5,5,5];
zeroes.fill(0);
zeroes.fill(7,3); //[0,0,0,7,7]
zeroes.fill(0);
zeroes.fill(7,1,3); //[0,7,7,0,0]
数组排序方法
reverse(): 将数组元素反向排列
sort():按升序排列数组元素,sort()会在每一项上调用String()转型函数,然后比较字符串来决定顺序。sort()方法可以接收一个比较函数。用于判断哪个值应该排在前面。
let values = [0,1,5,10,15];
values.reverse(); //[15,10,5,1,0]
values.sort(); //[0,1,10,15,5]
values.sort((x,y) => x - y); //[0,1,5,10,15]
迭代方法
every():对数组每一项都运行传入的函数,如果每一项都返回true,则这个方法返回true。
some():对数组每一项都运行传入的函数,如果有一项函数返回true,则这个方法返回true。
filter():对数组每一项都运行传入的函数,函数返回true的项会组成之后的返回。
map(): 对数组每一项都运行输入的函数,返回由每次函数调用的结果构成的数组。
forEach():对数组每一项都运行传入的函数,没有返回值。
let numbers = [1,2,3,4,5,6];
numbers.filter((item,index,array) => item > 2); //[3,4,5,6]
numbers.map((item,index,array) => item * 2); //[2,4,6,8,10,12]
numbers.forEach((item,index,array) => {
//执行某些操作
});
归并方法
reduce():从数组第一项开始遍历到最后一项。
reduceRight():从最后一项开始遍历至第一项。
let values = [1,2,3,4,5];
let sum = values.reduce((prev,cur,index,array) => prev +cur); //15
数组其他方法
concat(): 在现有数组全部元素基础上创建一个新数组。
slice():创建一个包含原有数组中一个或多个元素的新数组。
splice():在数组中插入(删除、替换)元素。第1个参数,操作的位置,第2个参数,要删除的元素个数,后面的n个参数,插入到数组中的元素。
indexOf():查找元素所在的索引位置。
lastIndexOf(): 和indexOf方法类似,区别是从后往前找。
includes():判断是否包含元素。
let color = ['red','green','blue'];
let color2 = colors.concat('yellow',['black','brown']);//['red','green','blue','yellow','black','brown']
let color3 = colors.slice(1); //['green','blue']
let color3 = colors.slice(1,2); //['green']
let removed = colors.splice(0,1); // removed = red; colors = ['green','blue']
colors.splice(1,0,'yellow','orange'); //在第一个位置插入两个元素 ['green',blue','yellow','orange']
let numbers = [1,2,3,4,5,6,7,8,9];
numbers.indexOf(4);//3
numbers.includes(5);//true
Map:
ES6新增的集合类型,可以给Map构造函数传入一个可迭代对象,需要包含键/值对数组。Map可以使用任何javascript数据类型作为键。map的值类型也是没有限制的。Map实例会维护键值对的插入顺序,可以根据插入顺序执行迭代操作。
API:
has(key) :判断键是否存在。
set(key,value):设置键值对。
get(key):根据key获取对应的值。
delete(key):删除键值对。
clear():清除这个map。
size属性:获取map的长度。
Map与Object比较:
内存占用:不同浏览器情况不同,但给定固定大小的内存,Map可以存更多的键值对
插入性能:插入Map一般会稍快。
查找速度:如果只包含少量键值对,Object速度更快,如果代码涉及大量查找操作,某些情况下选Object可能更好
删除速度:Map的delete()操作性能更优
综上所述,一般情况下使用Map代替Object做键值操作是更明智的选择。
WeakMap:
与Map类似的数据 结构,主要应对垃圾回收优化操作,它不会阻止垃圾回收操作。WeakMap不可迭代键,也不能clear()整个数据。它非常适合保存关联元数据,比如dom树种的一个元素,作为WeakMap的key,当dom元素被删除是,WeakMap对应的值被销毁。如果把dom元素做为Map的key,则不会释放dom元素,造成内存浪费。这是WeakMap中Weak的正解。
Set:
集合,存储不重复的值。Set会维护插入是的顺序,因此支持顺序迭代。
API:
add():增加值。
has():判断是否包含值。
delete():删除值
size属性:Set长度
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。