一 前言
博主是一个后端开发者,最近因为业务需要接触到了微信云开发,云开发的函数是用js写的,所以没办法,就开始狂补js基础,由于博主是原来是学java的,所以在学js的过程中就习惯带着java的逻辑来进行理解,发现了一些有趣的东西,这里和大家分享一下,欢迎大家一起讨论!(ps:新人理解,不足之处请见谅)
二 java中数组
俗话说的好,没有对比就没有伤害,有参照物的对比,我们才更能看出js中数组的特殊之处,在java中我们可以用以下几种方式建立一个数组
int[] ints = new int[3];
int[] ints2 ={1,2,3};
可见,我们要么指定数组的大小,要么直接给定数组的初始值,否则就会报错。
同时我们还无法访问超出长度的下标,否则会报错。
这是因为在底层会给数组划分一个固定的空间,如果我们不给定数组的长度,那么就无法完成初始化。在java中数组的长度和可以容纳的对象是固定的。
三 js中的数组
下面是一个js数组的使用方法,我们可以不规定长度,同时访问不存在的下标,给一个数组中放入不同的数据类型,这样的操作方式可以说是很阴间。
let array =[];
array[0]=1;
array[1]={};
那么可以完成这么离谱操作的数据结构的背后对应的是怎样的底层呢,没错,答案就是“对象” 。
四 对js数组底层的猜想
document.write(typeof []) //object
当我们使用 typeof 去测试数组的类型的时候,我们会发现,结构是object
还有一些很有意思的情况
let array = [];
array[1]="temp"
array[3]=1
for(temp in array){
document.write(" "+temp) // 1 3
}
document.write(array.length) //4
在这里我们给一个数组中放入两个元素,但是他们的下标分别是1和3。
当我们使用for in 循环来进行变量的时候我们得到是1 3 也就是我们存入的下标。
当我们去获取这个数组长度的时候我们获得的是4。
是不是很奇怪的情况。
我们不妨有这样的假设,js的底层是将数组以对象的形式来进行存储的,所以上述数组的实际存储情况就是
{
"1":"temp",
"3":"1"
}
因为for in 循环便利的是对象的属性名,而数组是将下标作为属性名来进行存储的,所以我们在使用for in循环的时候便利出的结果是 1 3
同时这里数组的长度也是直接根据最大下标加一计算得到的,所以会出现我们只有两个元素但是却显示长度为4(因为这里的最大下标是3)
所以js中的数组可以不用预先规定数组的长度和数组的类型,因为js中的对象可以随时添加属性,同时可以有任意类型的属性,也可以说明为什么使用typeof来查看数组类型时显示的是object。
五 总结
最终我们有这样的一个猜想,js中的数组底层是以对象的形式来进行存储的,以下标作为属性名,以储存的值作为属性值。所以js中的数组有着和集合相似的功能——储存任意类型的对象,弹性长度,但是两者的结构差别很大呦,欢迎大家继续讨论。
ps:新人想法,不足荒谬之处还请大佬指正