## 定义

1
const a = [1, 2, 3];
2
3
a['1'] // 2
Copied!

1
Object.keys(a); // ["0", "1", "2"]
Copied!

1
const a = new Array(3);
2
const b = ['A', 'B', 'C'];
3
b.length // 3
Copied!

1
b // A
2
b // C
Copied!

1
b = 'D'
2
b // D
Copied!
JS 数组中的元素可以是任何类型
1
const a = ['A', { name: 'B' }, () => 'C']
2
3
a // A
4
a.name // B
5
a() // C
Copied!

• push

1
const a = ['A', 'B'];
2
a.push('C');
3
a // ['A', 'B', 'C']
Copied!
• pop

1
const a = ['A', 'B'];
2
a.pop(); // B
3
a // ['A']
Copied!
• shift 取出第一个元素并返回
1
const a = ['A', 'B'];
2
a.shift(); // A
3
a // ['B']
Copied!
• unshift

1
const a = ['B'];
2
a.unshift('A');
3
a // ['A', 'B']
Copied!

1
const a = [];
2
a.age = 1;
3
a.age // 1
Copied!

• 随意给数组添加属性： arr.name = 'Arr'
• 制造断层
1
const a = [];
2
a = 1;
3
a = 10;
Copied!

$n$
，现在我们需要将一个元素插入到第
$i$

$i～n$

${\mathcal{O}(1)}$
。如果运气比较差，刚好要从头部插入，这样一来所有的元素都要往后挪，此时的时间复杂度为
${\mathcal{O}(n)}$
。得到平均的时间复杂度为
$(1 + 2 + 3 + ... + n) / n = \mathcal{O}(n)$

${\mathcal{O}(1)}$
。如果删除头部的元素，时间复杂度为
${\mathcal{O}(n)}$
，平均的时间复杂度也为
${\mathcal{O}(n)}$

${\mathcal{O}(n)}$

src/objects/js-array.h
1
// The JSArray describes JavaScript Arrays
2
// Such an array can be in one of two modes:
3
// - fast, backing storage is a FixedArray and length <= elements.length();
4
// Please note: push and pop can be used to grow and shrink the array.
5
// - slow, backing storage is a HashTable with numbers as keys.
6
class JSArray: public JSObject {
7
public:
8
// [length]: The length property.
9
DECL_ACCESSORS(length, Object)
10
11
// Number of element slots to pre-allocate for an empty array.
12
static const int kPreallocatedArrayElements = 4;
13
};
Copied!

• Fast：快速的存储结构是 FixedArray ，并且数组长度 <= elements.length()；快速的根据索引来直接定位，pushpop 操作会对数组进行动态的扩容和缩容
• Slow：慢速的基于 Hash 表来实现

• 快数组(FastElements)
FixedArray 是一种线性的存储方式。创建的新空数组，默认的存储方式是快数组，在 pushpop 时会进行对应的扩容和缩容。
• 慢数组(SlowElements)

• 快 --> 慢

1

2
3

Copied!
• 慢 --> 快

• Part 1
• 翻转整数
• 只出现一次的数字
• 两数之和
• 旋转图像
• Part 2
• 从排序数组中删除重复项
• 加一
• 买股票的最佳时机
• 移动零
• Part 3
• 两个数组的交集
• 一周中的第几天
• 有效的数独
• 除资深以外数组的乘积
• 存在重复元素
• Part 4
• 字谜分组
• 三数之和
• 无重复字符的最长子串
• 矩阵置零
• 递增的三元子序列

• 熟悉 JavaScript 中数组的常见操作，插入、删除、迭代、排序等。
• 能够解决一些数组相关的算法题。