跳到主要内容

数组

声明方式

// 字面量
let arr = [];
console.log(arr);
// 构造函数
let arr2 = new Array();
console.log(arr2);
// 不推荐使用
let arr3 = Array();
console.log(arr3);

所有声明的数组都继承自 Array.prototype

对象和数组的关系

let obj1 = {};
console.log(obj1.__proto__);
// 系统内置的构造函数
let obj2 = new Object();
console.log(obj2.__proto__);
let obj3 = Object();
console.log(obj3.__proto__);

所有对象都继承自 Object.prototype

数组的本质

对象模拟数组

// 索引值
let arr = [1, 2, 3, 4, 5];

let obj = {
0: 1,
1: 2,
2: 3,
3: 4,
4: 5,
};
console.log(arr[2]);
console.log(obj[2]);

JavaScript 数组底层基于对象实现,通过索引值访问数组元素。

数组在 JavaScript 中也是对象的一种表现形式。

空数组

let arr = [];

稀疏数组

稀疏数组的空位会被 empty 标识。

let sparseArr = [, ,];
console.log(sparseArr);
console.log(sparseArr.length);
// 无法打印空位
let filledArr = [1, 2, 3, 4, 5];
console.log(filledArr);
console.log(filledArr.length);
// 前面空位可以打印
let mixedArr = [, 1, 2, 3, 4, 5];
console.log(mixedArr);
console.log(mixedArr.length);

empty 是系统用于标识空元素的标记。

使用构造函数创建数组

// 语法错误示例
let arrWithEmpty = new Array(1, 2, 4, 5, , ,);
console.log(arrWithEmpty);
// 正确写法,避免空值
let arr = new Array(1, 2, 4, 5);
console.log(arr);
// 创建包含空位的数组
let emptyArr = new Array(5);
console.log(emptyArr);

数组的增删改

let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
// 增加元素
numbers[10] = 11;
// 修改元素
numbers[5] = 'aaa';
console.log(numbers);

数组的方法

修改原数组的方法

console.log(Array.prototype);
// 数组的所有方法都继承自 Array.prototype

push

在数组末尾添加元素,返回添加后的数组长度。

let numbers = [2, 3, 4];
numbers.push(5);
console.log(numbers);

自定义 push 方法

let numbers = [2, 3, 4];
Array.prototype.myPush = function () {
for (let i = 0; i < arguments.length; i++) {
this[this.length] = arguments[i];
}
return this.length;
};
let newLength = numbers.myPush(1, 2, 3);
console.log(newLength);
console.log(numbers);

unshift

在数组前端添加元素,返回添加后的数组长度。

let numbers = [2, 3, 4];
numbers.unshift(0, 1);
console.log(numbers);

pop

移除数组最后一个元素并返回该元素。

let letters = ['a', 'b', 'c'];
console.log(letters);
letters.pop();
console.log(letters);

shift

移除数组第一个元素并返回该元素。

let letters = ['a', 'b', 'c'];
console.log(letters);
letters.shift();
console.log(letters);

reverse

反转数组元素的顺序。

let digits = ['1', '2', '3'];
console.log(digits);
digits.reverse();
console.log(digits);

splice

// 使用方法
let arr = ['1', '2', '3'];
arr.splice(起始索引, 删除数量, 添加元素);

删除元素

let letters = ['a', 'b', 'c'];
// 从索引1开始删除1个元素
letters.splice(1, 1);
console.log(letters);

替换元素

let letters = ['a', 'b', 'c', 'e', 'f'];
// 从索引1开始删除2个元素,并添加3个4
letters.splice(1, 2, 4, 4, 4);
console.log(letters);
let letters = ['a', 'b', 'c', 'e', 'f'];
// 从索引3开始不删除元素,添加3个4
letters.splice(3, 0, 4, 4, 4);
console.log(letters);

使用负索引

let letters = ['a', 'b', 'c', 'e', 'f'];
// 在倒数第一位前添加3个4
letters.splice(-1, 0, 4, 4, 4);
console.log(letters);

负索引的处理

let letters = ['a', 'b', 'c', 'e', 'f'];

function getPositiveIndex(array, index) {
return index >= 0 ? index : array.length + index;
}
console.log(letters[getPositiveIndex(letters, -1)]);

sort

数字排序

let numbers = [-1, -5, 8, 0, 2];
numbers.sort((a, b) => a - b);
console.log(numbers);

字母排序

let letters = ['a', 'z', 'e', 'y', 'p'];
letters.sort();
console.log(letters);

字符串数组排序

sort 方法默认按照 ASCII 码排序。

let strings = ['27', '49', '5', '7'];
strings.sort();
console.log(strings);

sort 方法详解

比较函数需要两个参数,并返回一个值:

  • 返回负数:a 排在前面
  • 返回正数:b 排在前面
  • 返回 0:保持原顺序
let strings = ['27', '49', '5', '7'];
strings.sort((a, b) => (a > b ? 1 : -1));
console.log(strings);

随机排序

let numbers = [1, 2, 3, 4, 5, 7, 9, 10];
numbers.sort(() => (Math.random() - 0.5 > 0 ? 1 : -1));
console.log(numbers);

对象排序

let people = [
{ name: 'JJ', age: 18 },
{ name: 'GG', age: 12 },
{ name: 'AA', age: 3 },
{ name: 'WW', age: 1 },
{ name: 'QQ', age: 20 },
];
people.sort((a, b) => a.age - b.age);
console.log(people);

按长度排序

let strings = ['123', '123213', '213213', '1'];
strings.sort((a, b) => a.length - b.length);
console.log(strings);