一、数组定义的两种方式
1. 系统自带的构造方法
new Array(length/content);
例:
var arr = new Array(1,2,3,4,5)
这种写法和使用数组字面量实现的效果是一样的
var arr1 = new Array(10)
如果只传一个参数且是整数,系统会把这个数字当作要创建的数组的长度,来创建一个没值的空数组
2. 数组字面量
该方式和第一种方式差不多,也相当于new Array()
var arr = [];
例:
var arr = [1,2,3,4,5]
并不是数组的每一位都必须有值,如稀松数组:
var arr = [1,,,,,0]
var arr1 = [,,]
数组能使用的所有方法都来源于Array.prototype
二、数组的读和写
数组长度为num
- arr[num] //不报错 读出来是undefined
- arr[num] = xxx; //可以溢出写
例:
三、数组的常用方法
数组能使用的所有方法都来源于Array.prototype
(1) 改变原数组
1. push()方法
在数组的末尾添加 任意类型 任意个数 的数据,返回添加数据后的数组长度
数组的push()方法能被重写
Array.prototype.push = function(){
return 'haha'
}
重写push方法模拟原push方法
Array.prototype.push = function(){
for(var i = 0;i<arguments.length;i++){
this[this.length] = arguments[i];
}
return this.length
}
2. pop()方法
将数组的最后一位元素剪切(删除+返回)出来,传或不传参数都是一样的,只会剪切最后一位
3. shift()方法
将数组的第一位元素剪切(删除+返回)出来,传或不传参数都是一样的,只会剪切第一位(和pop()方法仅操作位置不同)
4. unshift()方法
向数组的首部添加 任意类型 任意个数 的数据,返回添加数据后的数组长度(和push()方法仅是添加位置的不同)
重写unshift方法模拟原unshift方法
Array.prototype.unshift = function(){
var arr = []
for(var i = 0;i<arguments.length;i++){
arr[i]=arguments[i]
}
arr.push(...this)
for(var i = 0;i<arr.length;i++){
this[i]=arr[i]
}
return this.length
}
5. reverse()方法
将数组首尾倒置,对原数组进行操作,没有生成新的数组,返回的是倒置后的原数组,传参无效
6. splice()方法
从数组的指定位置剪切(删除+返回)并添加相应的数据或只添加数组
格式:
arr.splice(n,m[,k,....])
-参数n:从第几位开始剪切
-参数m:剪切的长度
-参数k,…:在在切口处要添加的新数据
剪切并添加数据:
只添加数据:
注意:
数组的方法允许使用负数的下标
计算公式:pos(数组元素下标) = pos > 0 ? 0 : 数组长度
-1 -> 最后一位元素
-2 -> 倒数第二位元素
-3 -> 以此类推…
7. sort()方法
(2) 不改变原数组
1. concat()方法
arr.concat(arr1)
将数组arr和arr1拼接成一个新数组并返回,原数组不变
let arr = [1,2,3]
let arr1 = [4,5,6]
console.log(arr.concat(arr1))
2. toString()方法
arr.toString()
将数组arr以字符串的形式输出,传不传参没区别,不改变原数组
3. slice()方法
从数组的指定位置截取(不删除 只返回)数据,不改变原数组
格式:
arr.slice(n[,m])
-参数n:从该位置开始截取
-参数m:(可选)截取到该位置(不包括),没有参数m则默认截取到数组的末尾
4. join()方法和split()方法
arr.join(字符串<数字也可以,但字符串是标准语法>)
join()方法将数组按给定的参数(默认逗号)作为元素之间的连接符,返回一个字符串
join()方法可用于拼接字符串,相比栈内存的操作(原始值存储在栈内存中,先进后出)更高效
let str = 'alibaba';
let str1 = 'baidu';
let str2 = 'tencent';
let str3 = 'toutiao';
let str4 = 'aha';
let str5 = 'ohuo';
let strFinal = '';
var arr = [str,str1,str2,str3,str4,str5];//数组是个散列结构,存储在堆内存中
console.log(arr.join(''))
console.log(arr.join())//不传参数默认逗号连接
str.split(参数)
split()方法是字符串的方法,不是数组的方法,将字符串的元素按给定的参数拆分成数组,和数组的join()方法可逆
5.some()方法
用于监听数组中是否有元素满足指定条件,方法会遍历数组中的每个元素并执行逻辑,如果有一个元素满足条件,则不再继续遍历并返回true;如果没有满足条件的元素,则返回false
格式:
arr.some(func(currentVal,index,arr),thisVal)
参数1:遍历每个元素时的回调函数
-----参数currentVal:当前遍历到的元素值
-----参数index:可选,当前元素索引值
-----参数arr:可选,当前元素所属数组对象
参数2:可选,可指定回调函数内部的this指向对象,如果没有传或为null,回调函数里的this指向全局window(前提是回调函数不是箭头函数的形式)
some()不会对空数组进行检测
6.every()方法
用于检测数组所有元素是否都符合指定条件
如果数组中检测到有一个元素不满足,则整个表达式返回 false ,且剩余的元素不会再进行检测;如果所有元素都满足条件,则返回 true。
every() 不会对空数组进行检测
7.reduce()方法
归并,升序遍历数组的所有项,并构建一个最终值,并返回
格式:
arr.reduce(callback,[initialValue])
参数1:回调函数,数组中的每一个元素都会依次执行回调函数,不包括数组中被删除或从未被赋值的元素
-----参数previousValue :初始值 或 上一次回调函数的返回值
-----参数currentValue :当前元素
-----参数index:可选,当前元素下标
-----参数arr:可选,当前数组
参数2:可选,初始值,作为第一次调用回调函数时的第一个参数
let a = [4, 2, 3, 3]
// reduce方法不改变原数组,返回归并后的值
let b = a.reduce((previousValue , currentValue , index, arr) => {
/**
* 如果有提供初始值,第一次循环时previousValue 值就等于初始值
* 如果没有提供初始值,第一次循环时previousValue 值为arr[0]
* 后续循环中,previousValue 为上次循环的返回值
*/
console.log(previousValue , currentValue , index, arr)
//必须有return 否则下次循环previousValue 是undefined
return previousValue + currentValue ;
}, 0)
console.log(b)
无初始值
let a = [4, 2, 3, 3]
//reduce方法不改变原数组,返回归并后的值
let b = a.reduce((previousValue , currentValue , index, arr) =>
/**
* 如果有提供初始值,第一次循环时previousValue 值为初始值
* 如果没有提供初始值,第一次循环时previousValue 值为arr[0]
* 后续循环中,previousValue 为上次循环的返回值
*/
console.log(previousValue , currentValue , index, arr)
//必须有return 否则下次循环previousValue 是undefined
return previousValue + currentValue ;
})
console.log(b)
可以看到比设置初始值的少了一行输出,是因为没有设初始值,在第一次循环中previousValue为arr[0],currentValue为arr[1],直接进行计算了
由此得出结论:如果没有提供initialValue,reduce 会从索引1的地方开始执行 回调函数,跳过第一个索引;如果提供initialValue,从索引0开始。
8.reduceRight()方法
反向归并
9.filter()方法
用于过滤数组,满足条件的元素会被返回。该方法会返回一个新的数组,不会改变原数组
格式:
arr.filter((item,index,arr)=>{return ...})
-参数item:当前元素
-参数index:当前元素位置
-参数arr:数组本身
let arr = [1, 2, 3, 4, 5]
let new_arr = arr.filter(item => item > 2)
console.log(new_arr)
// 结果:[3, 4, 5]
可以使用filter()方法来移除数组中的undefined、null、NAN等值
let arr = [1, undefined, 2, null, 3, false, '', 4, 0]
let new_arr = arr.filter(Boolean)
console.log(new_arr)
// 结果:[1, 2, 3, 4]