前言: 在ECMAScript中最常用的数据类型除了object就属array了,作为一名刚入门的前端小白,除了算是复习巩固,也算是自己做个数组的总结。
创建数组
ECMAScript的数组和其他语言的数组会有比较大的区别,虽然是一组有序的数组,但是和其他语言的数组不同的是,它的每个槽位可以存储任意类型的数据,这意味着你可以创建一个数组,它的元素可以是字符串,数值,也可以是对象,并且每个元素的类型都没有限制,除此之外,它也是动态大小的,会随着数据的增加而自动增长。
有几种基本的方式可以创建数组。
使用Array构造函数
let colors = new Array()
如果你预先知道数组的元素数量或者长度的话,可以给构造函数传入一个数值,那么数组的length就会被自动设置为这个数值,例如:
let colors = new Array(20)
这个colors数组的长度就被自动设置为20。
值得注意的是:创建数组时给数组传入的值可以是数值也可以是其他类型的数组,当然,这两种不同的情况下数组的长度和数据还是会有些不一样的。 例如
let colors = new Array(3) //创建一个包含三个元素的数组(主要是长度为3)
let names = new Array("PepsiCo")//创建一个只包含一个元素,即字符串为"PepsiCo"的数组
创建数组的过程中,可以省略new操作符,结果也是一样的,这里就不示例了。
数组字面量表示法
在中括号中包含以,分隔的元素列表来表示数组,例如
let colors = ["red","yellow","blue"]//创建一个包含三个元素的数组
let names = []//创建一个空数组
let values = [1,2]//创建一个包含两个元素的数组
ES6新增语法:from()和of()
from()
先说说from() 当我第一次看到这个方法的时候我是觉得很神奇的,一个方法却可以做很多事,虽然最终都是将类数组结构转换为数组实例,不过还是有必要看看的。
Array.form() 的第一个参数是一个类数组对象,什么是类数组对象呢,就是任何可以迭代的结果,或者一个有length属性和可索引元素的结构,详细一点就是:
对于一个普通的对象来说,如果它的所有property名均为正整数,同时也有相应的length属性,那么虽然该对象并不是由Array构造函数所创建的,它依然呈现出数组的行为,在这种情况下,这些对象被称为“类数组对象”。通常,你会碰到的类数组对象有:函数中的 arguments 关键字,或者是一个 DOM 集合。
将字符串拆分为单字符数组
Array.from("one")//["o","n","e"]
可以使用from()将集合和映射转换为一个新数组 可点击查看from()使用技巧
cosnt m = new Map().set(1,2)
.set(3,4);
//感兴趣的小伙伴可以搜搜Map()方法,也是ES6新增的方法。map和数组类似,底层是用数组实现的,但是它更加灵活,可以创建键值对形式的数据集合,后续可通过Map().get()直接查找对应数据。
const s = new Set().add(1)
.add(2)
.add(3)
.add(4);
//Set()同样是ES6新增数据结构,似于数组,但它的一大特性就是所有元素都是唯一的,没有重复的值,我们一般称为集合。
console.log(Array.from(m)); //[[1,2],[3,4]]
console.log(Array.from(s)); //[1,2,3,4]
//可以用下面这种方式进行初始化数组
const length = 3;
const init = 0;
const result = Array.from({ length }, () => init);
result; // => [0, 0, 0]
可以对现有的数组进行浅复制(仅复制对象本身,但是不会复制其指向的对应指针对象)
const a1 = [1,2,3,4];
const a2 = Array.from(a1);
const a3 = Array.from([,,,]); //创建包含三个空位的数组
for (const val of a) {
alert (val === undefined);
}
//true
//true
//true
console.log(a1); //[1,2,3,4]
alert(a2 === a1); //false
可以使用任何可迭代对象
const iter = {
*[Symbol.iterator]() {
yield 1;
yield 2;
yield 3;
}
};
console.log(Array.from(iter));//[1,2,3,4]
一个数据结构只要具有Symbol.iterator属性,就可以认为是可以遍历的,也就是说我们自定义的类,只要部署了Symbol.iterator属性就可以遍历了,感兴趣的可以了解看看。
(较为常用)arguments对象可以被轻松的转换为数组
function getArgsArray() {
return Array.form(arguments);
}
console.log(getArgsArray(1,2,3,4)); //[1,2,3,4]
可以转换带有必要属性的自定义对象
const arrayLikeObject() {
0: 1,
1: 2,
2: 3,
3: 4
}
console.log(Array.from(arrayLikeObject)); //[1,2,3,4]
除了上面提到的接收第一个参数的操作外,它还可以接收第二个可选的映射函数参数,这个函数可以用于增强新数组的值,而不用像Array.form().map()那样先创建一个中间数组。当然,也可以接收第三个可选参数,用于指定映射的this的值,注意的是这个重写的this值在箭头函数中是不适用的。
const a1 = [1,2,3,4];
const a2 = Array.from(a1, x=>x**2);
const a3 = Array.from(a1, function(x) {return x**this.exponent}, {exponent: 2});
console.log(a2); //[1,4,9,16]
console.log(a3); //[1,4,9,16]
of()
可以把一组参数转换为数组,这个方法替代了ES6之前常用的Array.prototype.slice.call(arguments)这种十分笨拙的将arguments对象转换为数组的写法:
console.log(Array.of(1,2,3,4));// [1,2,3,4]
console.log(Array.of(undefined));// undefined
本节主要是提到如何创建数组,以及一些新增的ES6语法,具体数组方法包括迭代器方法,复制转换等方法将在数组第二篇中进行详细说明。下回见~~~