上一章认识了数组,这一章补充一些细节。
怎么创建数组
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 就对了。不需要加入新的项目,不写后面的值就好了。
操作数组的方法非常多,我们先理解和熟悉数组是个什么东西,再慢慢去学习这些方法,这样就不容易混乱。我这里无法一一介绍,希望大家在把基础知识掌握好之后,自己去查阅文档,扩展学习。
暂无评论内容