JavaScript基础-Array

这是我参与新手入门的第2篇文章

前言

每天一题算法,生活都充实了!正当我开心的沉醉在算法中,突然发现JavaScript不支持真正的多维数组,只能使用数组的数组来模拟。让我感受到自己才疏学浅,于是乎,开始重温Array吧。

大致分为以下几类:

数组的方法

稀疏数组

多维数组

类数组

数组的方法这里就不多说了,直接参考MDN,里面的帮助文档写的详细。

(数组的长度是0到232-1之间的整数)

稀疏数组

所谓稀疏数组,指的是元素没有连续索引的数组,length属性的值大于元素数,例如:[0,,2]。通俗的来讲就是数组中有间隙。

可以用Array()构造函数,或者给大于元素长度的索引赋值来创建稀疏数组

var sparseArr1 = new Array(10); //数组长度为10且没有元素

var sparseArr2 = [];
sparseArr2[9] = 0; //元素为0,数组的长度为10
复制代码

也可以通过字面量来创建

var sparseArr1 = [1,,3]; //有两个元素,但数组长度为3

var sparseArr2 = [,]; //没有元素,数组长度为1
var sparseArr2 = [,,]; //没有元素,数组长度为2
复制代码

多维数组

说到多维数组,不是很简单嘛,先来个二维数组:[[1],[2]]。深受Java的影响,为了申明一个二维数组的变量,于是我便大胆猜测var arr = new [][];然而,console里UncaughtSyntaxError:Unexpectedtoken]\color{red}{Uncaught SyntaxError: Unexpected token ‘]’}亮闪闪的红色字体映入眼帘。

怎么回事呢,JavaScript不支持真正的多维数组,可以使用数组的数组来模拟。以下才是常规操作:

var arr = new Array(5);
for(var i = 0; i < arr.length; i++){
    arr[i] = [1];
}
复制代码

首先定义一个数组arr,遍历arr数组中每一项并且赋值为数组[1]arr就变成[[1],[1],[1],[1],[1]]这样的二维数组啦。

亦或是直接字面量:

var arr = [[1],[1]];
复制代码

高级一点的写法:

var arr = Array.apply(null,{length:2}).map(value => value = [1]);
复制代码

此处arr的值为[1,1]。Array.apply(null,{length:2})是用来创建有初始化的数组,其结果为[undefined,undefined];与Array(2)没有初始化的结果[,]有所不同。

需要注意的是:

apply的第二个参数除了数组外,还可以是类数组对象。

map不会遍历数组中没有初始化的或被删除的元素。

类数组

类数组,顾名思义:类似数组但不是数组的对象,不能够全部使用数组的方法。满足类数组的条件:

length属性

使用数字作为属性名

例1:

var obj = {
    0 : 'STA',
    1 : 'SUN',
    length : 2
}
var arr = Array.from(obj); //['STA','SUN']
复制代码

obj以数字作为属性名并且有length属性,因此obj是一个类数组对象。当然可以通过Array.from()来将类数组转成数组。

例2:

var str = '123';
var arr = Array.from(str); //['1','2','3']
复制代码

字符串也可以看作类数组。

例3:

function foo(){
    console.log(arguments);
    //Arguments(2) [1, 2, callee: ƒ, Symbol(Symbol.iterator): ƒ]
    console.log(arguments.length); //2
}
foo(1,2);
复制代码

同样arguments也是一个类数组,arguments作为函数外部传入实参的集合,如果对参数进行处理,需要用到数组的方法,直接调用方法是不可取的。那么有办法让类数组中的数据使用数组的某些方法呢?当然是可以的:

function foo(){
    let arr = Array.prototype.map.call(arguments,value => value + 1);
    console.log(arr);  //[2,3]
}
foo(1,2);
复制代码

从上例可以看到,我们可以通过call改变数组map的执行环境,从而使类数组中的数据使用map方法;也可以先将类数组通过Array.from()转变成数组再进行map操作。

总结

稀疏数组是元素没有连续索引的数组;JavaScript不支持真正的多维数组,可以使用数组的数组来模拟;类数组需要有length属性以及数字属性名。

当然,写的可能不是很详细,或是错误的地方,欢迎大家补充、指正。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享