Array
双端队列(deque),存储有序的集合。
内部
数组是一种特殊的对象。使用方括号来访问属性 arr[0]
实际上是来自于对象的语法。它其实与 obj[key]
相同,其中 arr
是对象,而数字用作键key
。 它们扩展了对象,提供了特殊的方法来处理有序的数据集合以及 length 属性。但从本质上讲,它仍然是一个对象。 记住,数组是一个对象,因此其行为也像一个对象。
例如,它是通过引用来复制的。
js
let arr = ['abc', '123', '哈哈'];
arr.toString(); // 'abc,123,哈哈'
arr.push(function () {
return this;
});
// 类似于obj[method]() this指向arr
arr[arr.length](); // ['abc', '123', '哈哈', func...]
类数组
在浏览器和其它环境中有一种称为“类数组”的对象,它们 看似是数组。也就是说,它们有 length 和索引属性,但是也可能有其它的非数字的属性和方法。
JavaScript 中常见的类数组包括:
- Arguments 对象:函数内部自动包含的类数组对象,包含传递给函数的参数列表。
- NodeList 对象:DOM 操作返回的节点集合,如 document.getElementsByTagName、document.querySelectorAll。
- HTMLCollection 对象:DOM 操作返回的元素集合,如 document.getElementsByClassName、element.children。
这些类数组对象在某些方面类似于数组,但不具备数组的所有方法和特性。因此,有时需要将它们转换为真正的数组才能使用数组的方法
使用 Array.from() 方法:
js
let arrayLike = { 0: 'a', 1: 'b', 2: 'c', length: 3 };
let array = Array.from(arrayLike);
使用 Array.prototype.slice.call() 方法:
js
let nodeList = document.querySelectorAll('div');
let array = Array.prototype.slice.call(nodeList);
使用扩展运算符(spread operator):
js
let arrayLike = { 0: 'a', 1: 'b', 2: 'c', length: 3 };
let array = [...arrayLike];
稀疏数组
js
let sparseArray = [1, , 3, , 5];
- 内存占用:稀疏数组可能会占用更多的内存空间,因为它们会为每个缺失的元素保留一个空间。这可能导致内存浪费和影响性能。
- 遍历行为:在使用 forEach()、map() 等数组方法时,稀疏数组的空缺位置可能会导致意外的行为,因为这些方法会跳过空缺的位置,导致部分元素未被处理。
- JSON 序列化:将稀疏数组转换为 JSON 字符串时,空缺位置可能会被忽略,导致序列化结果与期望不符。
最大子数组
输入是以数字组成的数组,例如 arr = [1, -2, 3, 4, -9, 6]. 写出函数 getMaxSubSum(arr),用其找出并返回最大和。
js
function getMaxSubSum(arra) {
let partmax = 0;
let ar = arra.reduce((pre, curr) => {
partmax += curr;
partmax < 0 ? (partmax = 0) : partmax;
return Math.max(pre, partmax);
}, 0);
return ar;
}