JavaScript 数组:
1、它是值的有序集合
2、是无类型的,接受任意类型,且同个数组可以拥有多种类型
3、索引是基于 0 的 32 位数值,最大可能索引为 2^32-2
4、是动态的,在改变数组大小时不需重新分配空间
5、可以是稀疏的,即索引不一定要连续,元素与元素之间允许有空缺
6、有一个 length 属性,返回数组长度
7、是 JavaScript 对象的特殊形式
8、继承自 Array.prototype 中的属性,定义了一套丰富的数组操作
创建数组:
// 可以通过数组直接量或构造函数 Array 来创建数组 let arr = [1, , 3]; console.log(arr.length); // 输出3 arr = [, ,]; console.log(arr.length); // 数组直接量语法允许有可选结尾逗号,所以输出2 /* arr = new Array(); //创建空数组,等价[] arr = new Array(5); // 创建长度为5的数组,此时值与索引都未定义 // 当参数个数大于 1 时,参数指定数组的内容 arr = new Array(3, 4, {'x': 'y'}, [5, 6], "Hello"); */
数组的读写:
1、使用 [ ] 操作符来访问数组中的一个元素,方括号里是一个返回非负整数值的任意表达式
2、所有索引都是属性名,而只有 0~2^32-2 之间的整数属性名才是索引
3、可以使用负数或非整数来索引数组,但数值会转换为字符串,作为属性名来使用
4、若使用非负整数字符串,则将它转换为整数,并作为数组索引
5、数组索引仅仅是对象属性名的一种特殊类型,即 JavaScript 数组没有 “越界” 错误的概念,当属性不存在时仅仅得到 undefined 值
let arr = [1, 2, 3, 4, 5]; console.log(arr[0]); // 返回 arr[0] console.log(arr[arr[0]+1]); // 返回 arr[2] console.log(arr["2"]); // 返回 arr[2] arr["-1.2"] = 7; console.log("arr['1.2']: ", arr[-1.2]); // 返回 7 console.log(arr[1.23]); //返回 undefined
稀疏数组:
1、稀疏数组就是包含从 0 开始的不连续索引的数组
2、稀疏数组的 length 属性值大于元素个数
3、可以通过数组直接量、构造函数 Array() 和 delete 操作符来创建稀疏数组
let a1 = []; a1[100] = 0; // 创建一个长度为 101 的稀疏数组 let a2 = new Array(3); a2[2] = 3; // 创建一个长度为 3 的稀疏数组,等价 a2 = [, , 3] let a3 = [1, 2, 3, 4]; delete a3[1]; // 使数组变成长度为 4 的稀疏数组
注:减小数组 length 属性时会截去大于 length 部分的元素,我们可以设置 Object.defineProperty(arr, "length", {writable: false}) 使数组 length 属性变成只读,即无法修改数组大小
多维数组:
1、JavaScript 不支持真正的多维数组,但可以用数组的数组来近似地表示
2、可多次使用 [ ] 操作符来访问多维数组的元素
let arr = [[[1, 2] ,[3, 4]], [5, 6]]; console.log(arr[0][0][0] + arr[0][1][1] + arr[1][1]); // 返回 1+4+6