一.关于数组
1.什么是数组
①,数组的数据类型是Object,也就是说数组是对象。
②,数组是按照顺序排列的一组值,这也是区别于普通对象的一种特征。
③,数组是Array构造函数的实例,原型指向Array.prototype,并继承其属性和方法。普通对象则继承Object.prorotype的属性和方法,这也是区别于普通对象的一种特征。
④,var arr = [1,'2',{},function(){},null,true,[ ] ];arr就是数组,[ ]这两个方括号就是数组的特征。里面的成员可以是任意数据类型。
⑤,数组的成员不需要写下标,因为下标是固定的,0代表第一个1代表第二个......
2.数组成员以及length属性
①,数组里面的每个成员,都有按次序排列的下标,也就是键值,从0开始到4294967294(2的32次方减2)结束。
②,length属性的值,初始由数组成员数量决定,最多4294967295(2的32次方减1)个。因为数组成员的下标从0开始,所以length的值为数组中存在的最大下标加1。
⑴.length属性可写,如果写入的值大于实际数组成员数量,那么成员数量就等于你写入的值但多出的全部是空位,空位就是位置上啥都没有[,,,,,,]。
⑵.写入的length属性小于实际数组成员,成员数量还是等于你写入的值,多出的全部删除,如果length=0,则清空所有成员,这是一个清空数组的办法。
③,读取数组成员的方法就是arr[key],key为下标,下标就是成员所在的位置。
⑴.可动态添加或覆盖数组成员,直接赋值即可,arr[key] = value。
⑵.delete命令可删除一个成员,删除以后该位置为空位,空位就是该位置啥都没有,但是这个位置还存在,所以不影响length的值,也不影响其他成员的位置。
④,可以不按照数组方式添加成员,比如arr.name = '张三',但这并不会影响其他成员,也不会影响length的值,也就是说不会影响length所表示的成员数量以及其他成员的下标。
3.遍历数组
①,in运算符
⑴,和对象一样,可以查看一个成员是否存在于数组当中,使用方法:key in arr,如果存在返回true,不存在返回false。空位返回false。
②,for.....in......
⑴,用来遍历数组,但需注意,除了不可遍历属性以及空位不被遍历以外,非数字键也会被遍历,继承属性也会被遍历。
③,for循环和while循环遍历可以遍历空位。
⑴, 声明一个数组arr = [1,2,3,4,5,,];。
for (var index=0;index<arr.length;index++){
console.log(arr[index])
}//1,2,3,4,5,undefined
4.关于空位
①,[,,,,,,,]这是空位。
②,写入的length的值大于当前数组成员数量,多出来的也是空位。
③,delete删除的成员也是空位。
④,读取空位的值为undefined,比如读取[,,]里面的空位以及上面②③的操作,但是注意,这和[undefined,undefined]是完全不一样的,因为undefined是实实在在的存在的值。
⑤,空位([,,])就是空占位置,没有任何东西,虽然他返回undefined。就比如一个已经被声明,但没被赋值的变量一样,比如var a。
⑥,[undefined]是有东西的,一目了然,值也是undefined。这个变量是这么声明的:var a = undefined。
二.关于Array构造函数
1.Array是什么
①,它是一个函数,函数属于Object类型,所以它也是一个对象。
②,它是JS内置的原生对象。是Function的实例。原型对象指向Function.prototype.
③,数组是Array的实例。数组的原型对象指向Array.prototype。所以继承了后者的属性和方法。
2.Array怎么用
①,var arr = new Array();声明一个数组。
⑴,一个正整数参数,实例的数组length属性与之对应。
⑵,多个参数or一个非数字参数,实例的数组成员与之一一对应。
⑶,没有参数,实例的数组为空数组。
⑷,一个小数或负数为参数,报错。
②,new Array()与Array()作用是一样的。也就是说,①里介绍的用Array()完全可以实现。
3.实例继承的方法
①,arr.pop() arr.push()
⑴,push()接受一个或多个参数,将其插入数组尾部,返回一个插入后的数组length属性。
⑵,pop()删除最末端成员,返回该成员属性值。
⑶,它俩构成先进后出,也就是stack,栈。
②,arr.shift() arr.unshift()
⑴,unshift()接受一个或多个参数,将其插入数组首部,返回一个插入后的数组length属性。
⑵,shifth()删除最前端成员,返回该成员属性值。
⑶,push()和shift()结合使用,就构成了“先进先出”的队列结构。
③,arr.join();
⑴, join()方法以指定参数作为分隔符,将所有数组成员连接为一个字符串返回。如果不提供参数,默认用逗号分隔。
⑵,如果数组成员是undefined或null或空位,会被转成空字符串。
④,arr.concat()
⑴,接受多个参数,用于合并数组,如果参数是数组,则合并数组,如果是其他类型的值,则依次添加到原数组中,返回一个新数组。不会修改原数组
⑵,会在数组尾部添加合并项。
⑶,参数可为空,那就会返回一个和原数组一模一样的数组出来。
⑤,arr.reverse()
⑴,reverse方法用于颠倒排列数组元素,返回改变后的数组。注意,该方法将改变原数组。
⑥,arr.slice()
⑴,该方法可以取出数组的一部分并返回一个新数组。
⑵,接受两个参数,第一个为起始位置(从零开始),第二个为终点位置(并不包含该位置),接受负数,负数代表倒着定位置。只有一个参数的话就从这个位置一直到终点。不些参数就提取全数组并返回,相当于拷贝了原数组。第二个参数代表的位置如果在第一个的前面,返回空数组。
⑦,arr.splice()
⑴,splice方法用于删除原数组的一部分成员,并可以在删除的位置添加新的数组成员,返回值是被删除的元素。注意,该方法会改变原数组。
⑵, splice的第一个参数是删除的起始位置(从0开始),第二个参数是被删除的元素个数。如果后面还有更多的参数,则表示这些就是要被插入数组的新元素(在起始位置插入)。
⑶,起始位置如果是负数,就表示从倒数位置开始删除。
⑷,如果只是单纯地插入元素,splice方法的第二个参数可以设为0。
⑸,如果只提供第一个参数,等同于将原数组在指定位置拆分成两个数组。
⑧,arr.sort()
给数组成员排序,默认按照unicode码点排序,如果成员不是字符转会先转为字符串。
该方法接受一个函数作为参数,参数函数本身接受两个参数,比如a和b,a代表数组的第一个成员,b就代表第二个成员。从大到小排,就在参数函数的函数体内return b-a,反之return a-b。
⑧,arr.map()
⑴,map方法将数组的所有成员依次传入参数函数,有几个成员就执行几次,然后把每一次return出来的值按次序组和成数组返回。
⑵,map方法接受一个函数作为参数。该函数调用时,map方法向它传入三个参数:当前成员、当前位置和数组本身。
⑶,map方法还可以接受第二个参数,用来绑定回调函数内部的this变量(详见《this 变量》一章)。
⑷,如果数组有空位,map方法的回调函数在这个位置不会执行,会跳过数组的空位。
⑸,map方法不会跳过undefined和null,但是会跳过空位。
⑨,arr.forEach()
和map方法几乎一样,就是没有返回值。就是循环遍历数组,不会被break和container打断。
⑩,arr.filter()
⑴,同样也是遍历数组,也是每存在一个成员就执行一次,也会返回一个数组,只不过不同在于它在每次执行的时候都要查看return出来的值所转换的布尔值,然后把每次return出转换布尔值为true的回合所对应的数组成员组合成新数组返回。
⑪,arr.reduce()
⑴,该方法牛逼去了,太强大了,他接受两个参数,第一个是函数,第二个是初始值(累计变量的初始值),这个初始值可以是任意数据类型。参数函数接受四个参数,分别是累计变量(默认数组第一个成员),当前变量(默认数组第二个成员),当前位置,原数组。
⑵,每次执行结束,会把return的值赋值给累计变量,当遍历结束,返回累计变量的最后值。
⑫,arr.indexOf(),arr.lastIndexOf()
⑴,indexOf方法返回给定元素在数组中第一次出现的位置,如果没有出现则返回-1。
⑵,indexOf方法还可以接受第二个参数,表示搜索的开始位置。
⑶,lastIndexOf方法返回给定元素在数组中最后一次出现的位置,如果没有出现则返回-1。
注意,这两个方法不能用来搜索NaN的位置,即它们无法确定数组成员是否包含NaN。这是因为这两个方法内部,使用严格相等运算符(===)进行比较,而NaN是唯一一个不等于自身的值。
参考:阮一峰JS教程