第一百零七章 数组(二)

上一章认识了数组,这一章补充一些细节。

怎么创建数组

const a = [];const b = [1, 2, 3];const c = [3];const d = new Array();const e = new Array(1, 2, 3);const f = new Array(3);

这是几种常见的创建数组的方法。其中:

  • b 和 e 创建的数组是一样的;
  • a 和 d 创建的数组是一样的,都是一个空数组;
  • c 是一个只有一个元素的数组;
  • f 很特殊,当 new Array() 的小括号里只有一个值,并且是数字的时候,这个值设置了这个数组的长度。所以这是一个长度为 3 的数组。[1]

如何设置(修改)数组项的值

把每个数组项当做一般变量来操作就可以了。

const a = ['a', 'b', 'c'];a[1] = 2;console.log(a);

大家可以试一试上面的代码。引出一个问题:const 设置的是常量,无法修改,这里怎么发生了变化?

这里如果你写 a = 2,就会报错,因为你试图修改一个常量 a,但是,修改 a 对应的数组中的项目却是没问题的。包括增加、删除项目,也都可以。这是不是很矛盾?其实这很讲道理:

数组(包括我们后面要讲的对象)可能是一个很大的数据(的集合),也就意味着可能占据大量的内存空间。你知道了,性能!

如果我们在赋值的时候,真的把一个数组赋值给了变量,那么对于程序的性能就很难控制了。毕竟赋值给多少个变量,就意味着把这个数组重复创建了多少遍,也就是在内存中占用的空间等比例增加。如果恰好这个数组比较大,可能一个操作不慎,比如在循环的时候被重复创建几千遍……内存就哭了。

所以,对于数组和对象这种数据集合,我们只创建一次,变量也不是真的被赋值为这个数组或者对象,而是指向了这个数据。

换言之,这时候变量真正代表的不是这个数据,而是这个数据在哪里。那么我们修改数组中的项目对于常量来说并没有影响,因为它指向了这个数组,而这个指向一直没有发生变化,所以常量没变,只是指向的数据在发生变化。

这就如同我们在电商网站填写了自家的地址,这是一个指向信息,快递凭着地址找到你家,给你送快递。后来你把家里的车库改成了工作室(房子发生了变化),但是你的地址并不会因此而改变,所以,快递依旧能凭着以前的地址找到你家。

写一个小案例,验证一下:

const a = [1, 2, 3];const b = a;const c = a;b[1] = 5;console.log(c);let d = 5;let e = d;let f = d;e = 6;console.log(f);

这个和 const 或者 let 没啥关系,你也可以都改成 let,结果是一样的,但是都改成 const,那么后半部分会报错,因为试图修改常量。

如何增加数组项

const a = [];a.push(1);console.log(a);a.push(2, 3);console.log(a);

用 push 方法就可以了,后面的小括号里可以是一项,也可以是多项(逗号分隔)。push 进来的项目追加在数组的最后面。

如何删除数组项

显然 push 是有很大局限性的。所以我们再讲一种方法:

const a = [1, 2, 3];a.splice(1, 1, 22);console.log(a);

splice 方法稍微复杂一些,但也更加强大。它后面小括号里可以有多个数据,其中第一个值表示从数组中序号为几的元素开始,第二个值表示往后面删除几个数组项,再后面是在这个位置要添加项目,可以多个。

如果不需要删除,那么第二个值写 0 就对了。不需要加入新的项目,不写后面的值就好了。


操作数组的方法非常多,我们先理解和熟悉数组是个什么东西,再慢慢去学习这些方法,这样就不容易混乱。我这里无法一一介绍,希望大家在把基础知识掌握好之后,自己去查阅文档,扩展学习。

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

请登录后发表评论

    暂无评论内容