Array
跟其他语言中的数组一样,ECMAScript 数组也是一组有序的数据,但跟其他语言 不同的是,数组中每个槽位可以存储任意类型的数据。
这意味着可以创建一个数组,它的第一个元素 是字符串,第二个元素是数值,第三个是对象。ECMAScript 数组也是动态大小的,会随着数据添加而 自动增长。
创建数组
使用构造函数创建数组:
//1. 基本用法
let arr1 = new Array();//[]
//2. 设定数组长度
let arr2 = new Array(5);//[空 × 5]
//3. 设定数组内元素
let arr3 = new Array(1, 3, 5);//[1, 3, 5]
使用数组字面量方式创建:
let arr1 = [];
let arr2 = [1, 2];
ES6 from() 方式创建:from()用于将 类数组结构转换为数组实例
//1. 字符串会被拆成单个字符
Array.from("matt");//["m", "a", "t", "t"]
//2. 使用from()将集合和映射转换为一个新数组
const map = new Map().set(1, 2)
.set(3, 4);
const set = new Set().add(1)
.add(2)
.add(3)
.add(4);
Array.from(map);//[Array(2), Array(2)]
Array.from(set);//[1, 2, 3, 4]
//3. 对现有数组进行浅复制
let arr1 = [1, 2, 3, 4];
let arr2 = Array.from(arr1);
arr1 === arr2;//false
//4. 将任何可迭代对象转换为数组
const iter = {
*[Symbol.iterator](){
yield 1;
yield 2;
yield 3;
yield 4;
}
};
Array.from(iter);//[1, 2, 3, 4]
//5. 转换arguments对象
//6. 将某些带有必要属性的对象转换为数组,keys需要能够转换为数字,且具有length这一项
const obj = {
0:1,
1:2,
2:3,
length:3//必要属性
}
Array.from(obj);//[1, 2, 3]
let obj1 = {
1:2,
2:3,
3:4,
length:3
}
Array.from(obj1);//[undefined, 2, 3] 说明它会从0开始
let obj2 = {
"a":2,
"b":3,
"c":4,
length:3
}
Array.from(obj2);//[undefined, undefined, undefined]
//7. Array.from()还接收第二个可选的映射函数参数。这个函数可以直接增强新数组的值,而无须像调用 Array.from().map()那样先创建一个中间数组。
const a2 = Array.from([1, 2, 3, 4], x => x*2);//[2, 4, 6, 8]
ES6 of() 方式创建:of()用于将一组参数转换为数组实例
//用于替代 Array.prototype.slice.call(arguments),将 arguments 转换为数组
Array.of(1, 2, 3, 4)//[1, 2, 3, 4]
检测数组
经典的 ECMAScript 问题:判断一个对象是不是数组
- 只有一个网页时,使用
instanceof
就行。
let arr = [1, 2, 3];
arr instanceof Array;//true
-
若网页中有多个框架,可能会有不同的全局执行上下文,因此会有不同版本的Array构造函数,影响
instanceof
的判断ECMAScript 提供了
Array.isArray()
方法。这个方法的目的就是确定一个值是 否为数组,而不用管它是在哪个全局执行上下文中创建的。
迭代器方法
ES6中,Array 的原型上暴露了 3 个用于检索数组内容的方法:keys()
、values()
和 entries()
。可用用于拆分键值对
let arr = ["H", "e", "l", "l", "o"];
const arrKeys = Array.from(arr.keys());//[0, 1, 2, 3, 4]
const arrValues = Array.from(arr.values());//["H", "e", "l", "l", "o"]
const arrEntries = Array.from(arr.entries());//结果见下图
使用解构拆分键值对:……这个谷歌浏览器好像没实现?
let arr = ["H", "e", "l", "l", "o"];
for(const [idx, element] of arr){
console.log(idx, ":", element);
}
二维数组
//初始化二维数组
var len = s.length;
var arr = new Array(len);
for(var i = 0;i<len;i++){
arr[i] = [];
for(var r = 0;r<len;r++){
arr[i][r] = 0
}
}