1. 数组
存储一系列类型相同的值。
但是,在
JavaScript
中可以不保存相同类型的值。
1.1 数组的创建和初始化
// 方式一
let arr = new Array();
let arr = new Array(7);
let arr = new Array('monday', 'tuesday');
// 方式二
let arr = [];
let arr = ['monday', 'tuesday']
1.2 添加元素
1.2.1 在数组末尾添加元素
-
去长度
arr.length
添加let arr = [1, 2, 3, 4, 5]; arr[arr.length] = 6;
-
push()
let arr = [1, 2, 3, 4, 5]; arr.push(7);
1.2.2 在数组开头插入元素
-
循环添加:
let arr = [1, 2, 3, 4, 5]; arr[arr.length] = 6; arr.push(7); // 头插:在原型上加入该方法 Array.prototype.insertFirstPosition = function(value){ for(let i = this.length; i > 0; i --){ this[i] = this[i - 1]; } this[0] = value; } arr.insertFirstPosition(0) console.log(arr);
-
unshift()
方法let arr = [1, 2, 3, 4, 5]; arr.unshift(-1); console.log(arr);
1.3 删除元素
1.3.1 尾删
pop()
方法
let arr = [1, 2, 3, 4, 5];
arr[arr.length] = 6;
arr.push(7);
arr.pop();
console.log(arr);
1.3.2 头删
-
自定义方法——循环删除
-
注意BUG:
for(let i = 0; i < arr.length; i ++){ arr[i] = arr[i + 1]; // NOTICE: arr[arr.length - 1] = arr[arr.length] = undefined } for(let i = 0; i < arr.length - 1; i ++){ arr[i] = arr[i + 1]; // NOTICE: arr[arr.length - 1] 值还在 }
-
正确办法:
// 重新返回一个新数组 Array.prototype.removeUndefined = function(arr){ let newArr = []; for(let i = 0; i < arr.length; i ++){ if(arr[i] != undefined){ newArr.push(arr[i]) } } return newArr; } // 删除元素! Array.prototype.deleteFirstPostion = function(){ for(let i = 0; i < this.length; i ++){ this[i] = this[i + 1]; } return this.removeUndefined(this) }
// 完整示例 let arr = [1, 2, 3, 4, 5]; // insert arr[arr.length] = 6; arr.push(7); // 重新返回一个新数组 Array.prototype.removeUndefined = function(arr){ let newArr = []; for(let i = 0; i < arr.length; i ++){ if(arr[i] != undefined){ newArr.push(arr[i]) } } return newArr; } Array.prototype.deleteFirstPostion = function(){ for(let i = 0; i < this.length; i ++){ this[i] = this[i + 1]; } return this.removeUndefined(this) } // delete arr = arr.deleteFirstPostion()
-
-
shift()
arr.shift()
1.4 在任意位置删除或插入元素
1.4.1 splice(index, number, value)
// 从 index = 0开始,删除两个元素
arr.splice(0, 2);
// 从 index = 2开始,删除0个元素,插入3个元素
arr.splice(2, 0, 1, 2, 3);
1.4.2 delete
长度没有改变,值改为undefined
。
// arr[3] = undefined!!!
delete arr[3]
let arr = [1, 2, 3, 4, 5];
console.log(arr.length);
delete arr[0];
console.log(arr.length);
1.5 JavaScript 的数组方法
1.5.1 数组合并
arr1 = [1, 2, 3];
arr2 = [4, 5, 6];
let arrNew = arr.concat(arr1, arr2);
1.5.2 迭代器函数
-
every()
// 判断 arr 中的元素是不是都为偶数。 let arr = [1, 2, 3, 4, 5, 6, 7]; let value = arr.every(x => { return x % 2 == 0 }) console.log(value);
-
some()
// 判断 arr 中的元素是否含有偶数。 let arr = [1, 2, 3, 4, 5, 6, 7]; let value = arr.some(x => { return x % 2 == 0 }) console.log(value);
-
forEach()
let arr = [1, 2, 3, 4, 5, 6, 7]; arr.forEach(x => { if(x % 2 == 0){ x ++; } console.log(x); });
-
map()
let arr = [1, 2, 3, 4, 5, 6, 7]; let value = arr.map(x => { return x % 2 == 0; }) console.log(value); // false, true,false, true,false, true,false
-
filter()
let arr = [1, 2, 3, 4, 5, 6, 7]; let value = arr.filter(x => { return x % 2 == 0; }) console.log(value); // 2, 4, 6
-
reduce(preValue, currentValue[, index, array])
返回一个被叠加到累加器的值。let arr = [1, 2, 3, 4, 5, 6, 7]; let value = arr.reduce((preValue, currentValue, index, array) => { return preValue + currentValue }) console.log(value);
1.6 ES6 和 数组的新功能
1.6.1 for...of...
let arr = [1, 2, 3, 4, 5, 6, 7];
for (const value of arr) {
console.log(value);
}
1.6.2 @@iterator
对象
let arr = [1, 2, 3, 4, 5, 6];
let iterator = arr[Symbol.iterator]();
console.log(iterator.next().value);
console.log(iterator.next().value);
console.log(iterator.next().value);
console.log(iterator.next().value);
1.6.3 entries()
keys()
values()
let arr = [1, 2, 3, 4, 5, 6];
let iterator = arr[Symbol.iterator]();
let entry = arr.entries();
for(let i = 0; i < arr.length; i ++){
console.log(entry.next().value);
}
let keyValue = arr.keys();
for(let i = 0; i < arr.length; i ++){
console.log(keyValue.next().value);
}
let keyValue = arr.values();
for(let i = 0; i < arr.length; i ++){
console.log(keyValue.next().value);
}
1.6.4 Array.from()
// 复制数组
let arr = [1, 2, 3];
let newArr = Array.from(arr);
1.6.5 Array.of()
根据传入的参数创建一个新数组。
let arr = [1, 2, 3];
let newArr = Array.of(1, 2, ...arr);
1.6.6 Array.fill()
用静态值填充数组。
// 会改变原数组
let arr = [1, 2, 3];
arr.fill(10);
console.log(arr);
// 创建一个数组并且值全为0
let ones = Array(5).fill(0);
console.log(ones);
let arr = [1, 2, 3, 4, 5, 6];
arr.fill(0, 3, 5);
console.log(arr); // [ 1, 2, 3, 0, 0, 6 ]
1.6.7 Array.copyWithin()
复制数组中的一系列元素到同一数组指定的起始位置。
let arr = [1, 2, 3, 4, 5, 6, 7, 8];
arr.copyWithin(0, 6);
console.log(arr); // 7, 8, 3, 4, 5, 6, 7, 8
arr.copyWithin(1, 3, 5);
console.log(arr); // 7, 4, 5, 4, 5, 6, 7, 8
1.6.8 排序元素 sort()
let arr = [1, 4, 2, 5, 11, 44, 121, 990];
function compare(a, b){
if(a > b){
return 1;
}
if(a < b){
return -1;
}
if(a == b){
return 0;
}
}
arr.sort(compare);
console.log(arr);
// 简化
arr.sort((a, b) => a-b);
1.6.9 搜索
indexOf()
返回与参数匹配的第一个元素得索引。lastIndexOf()
返回与参数匹配的最后一个元素得索引。find()
返回满足条件的第一个值;没有返回undefined。findIndex()
返回满足条件的第一个值得索引;没有返回-1。includes()
判断是否存在某元素,true | false。
1.6.10 输出数组为字符串
toString()
join()
let arr = [1, 2, 4, 5, 6, 43, 55];
console.log(arr.join(''));// 124564355
console.log(arr.join('-'));// 1-2-4-5-6-43-55
console.log(arr.toString()); //1,2,4,5,6,43,55