JavaScript数组isArray,from,slice,concat,indexOf,lastIndexOf 的解析及重构
数组的静态方法
根据数组的类型创建了一个新的数组对象(数组的实例化对象)
var arr=new Array(1,2,3);
用数组的实例对象调用的方法,就叫做实例化对象方法
arr.push();
Array.from();
这种方法没有使用实例化数组对象调用,而是直接使用数组类型调用方法,
这种方法叫静态方法,类属判断,不是单独个体判断
Array.isArray();
判断是否是数组,返回布尔值,true和false
length判断太局限,只能判断对象,例如arguments列表就判断不了
重构Array.isArray,对象下的一个方法
Array.isArray_1=function(){return list.construcotr===Array}var b=Array.isArray_1(arr);console.log(b);
Array.from();
将非数组的列表形式(具有length的列表类型)转换为数组,返回一个新数组
也能将数组转换为数组,内容一样,但不是同一个数组,相当于复制,改变原数组,不会影响新数组
重构Array.from方法一
Array.from_1 = function (list) {return [].slice.call(list);};
重构方法二
Array.from_1=function{return []concat.apply([],list);}
案例:将body中获取的元素放在数组中
var divs=document.getElementsByTagName("div");
var arr=Array.from(divs);
console.log(arr);
slice
slice 返回数组中指定的下标开始位置到结束位置的元素组成的新数组,原数组不改变。可以用来复制数组
var arr1=arr.slice();复制所有元素
var arr1=arr.slice(2);从开始到尾部元素
var arr1=arr.slice(-2);如果是负数,从倒数下标开始到尾部元素
var arr1=arr.slice(2,3);从下标2到第3位,不包含第3位,从开始位置到开始位置之前,结束位置必须大于开始位置,否则返回空数组
var arr1=arr.slice(2,arr.length);
var arr1=arr.slice(-3,5);负数开始都会先变成正数再截取复制(arr.length+(-3))
var arr1=arr.slice(-3,-2);负数开始都会先变成正数再截取复制(arr.length+(-3))到(arr.length+(-2))
slice重构
var arr=[1,2,3,4,5,6,7,8,9]function slice(arr,start,end){if(start===undefined)start=0;if(end===undefined)end=arr.length;if(start<0)start=arr.length+start;if(end<0) end=arr.length+end;start=parseInt(start);end=parseInt(end);var list=[];for(i=start;i<end;i++){list[list.length]=arr[i]}return list;}var arr1=slice(arr,2,5);console.log(arr1)
concat
concat将一个或一个以上的数组与原数组拼接成为一个新数组,并且返回这个新数组,原数组不改变
拼接的不单纯是数组,也可以是元素
var arr2=arr.concat(arr1,8,8,8,8);
如果是列表也作为元素拼接进去
var arr=[3,4,5,6];
console.log(arr.concat(arguments));
arr1=arr.concat();//会复制新数组
重构concat
var arr=[1,2,3,4,5,6]function concat(){var list=[];for(var i=0;i<arr.length;i++){list[list.length]=arr[i];}for(var j=1;j<arguments.length;j++){if(arguments[j].constructor===Array){for(var k=0;k<arguments[j];k++){list[list.length]=arguments[j][k];}}else list [list.length]=arguments[j]}return list;}var arr2=concat(arr,2,3,4);console.log(arr2)
indexOf
arr.indexOf(3)查找元素在数组中的下标,如果没有查找到返回-1,找到直接返回不再往后查找
对象型数组中查找对象,不要新建对象查找
arr.indexOf(3,2)从下标2开始往后查找
arr.indexOf(3,-2)负数转换为正数后查找(arr.length+(-2))
重构indexOf
var arr=[1,2,3,4,5]function indexOf(arr,elem,start){if(start===undefined)start=0if(start<0)start=arr.length+start;for(var i=start;i<arr.length;i++){if(arr[i]===elem)return i;}return -1;}var index=indexOf(arr,3);console.log(index)
案例:用最少的循环找出1分别出现的下标
var arr=[1,4,2,3,1,4,2,1,2,3,4,1,1,2,3,2,1];var index=-1;while(~(index=arr.indexOf(1,++index)))console.log(index);
lastIndexOf
arr.lastIndexOf(6);从后向前查找6
arr.lastIndexOf(6,-4);从后向前数第4位开始向前查找6
重构lastIndexOf
var arr=[1,2,3,4,3,5,6,7,8]function lastIndexOf(arr,elem,start){if(start===undefined)start=arr.length;if(start<0)start=arr.length+start;for(var i=start;i>=0;i--){if(arr[i]===elem)return i;}return -1;}var index= lastIndexOf(arr,3,-6);console.log(index)