今天来我们来看看我们平时用的非常多的数组和对象之间有什么你不知道的东西吧。
1.数组和对象的关系
其实数组和对象是非常接近的,不过还好对象可不是数组的“对象”,不然我得要着急连数组都找到对象了>.<。 他们之间的关系其实就像是一母同胞的亲兄弟,连穿一条裤子的好兄弟也比不上它们。我们可以先来看一段代码:
let b = {
0 : 1,
a : 2,
1 : 3
}
console.log(b[0], b[1],b[2])
for(let s in b)
console.log(`${s}.${b[s]}`)
我们先定义这样一个对象b,并且通过打印数组和打印对象的方法输出它,我们可以得到这样的结果:
[Running] node "e:\codespace\js\scope\1.js"
1 3 undefined
0.1
1.3
a.2
我们会发现数组只能输出0和1,b[2]是undefined,而对象则输出了其中所有的元素。 你能从其中发现几个问题?
1.1数组的下标输出有序性
当我们打印b[0], b[1],b[2]的时候,显然我们可以看见对象中并不存在b[2],所以undefined是可以预见的,但是如果我们选择这样打印呢?
console.log(b[0], b[1],b[a])
结果将会是报错,因为数组的下标并不能是'a',那我们就发现,变成obj数组之后我们就失去a : 2,难道这就是数组和对象的区别嘛?数组只是一个特例?
数组和对象事实上都是一种键值对的对应,但是数组由于下标的特殊性我们其实可以知道,数组是一个按照顺序排列的对象,而对象中则是无序的。然而标准没有要求过顺序,也没有明确过JS内存模型。作为一种顺序的线性储存结构,数组有着目前读取最快的方式,所以在一类特殊的对象之中就是以数组的形式储存的。
那么我们就明确了,数组通过固定的顺序将数据顺序排列,使用顺序的下标来读取正是在对应情况下的一种优秀的选择。可是在这一串代码中我们还是有疑问,不知道你们有没有留意for in输出的a和实际存放在对象中的a位置竟然并不一样?
1.2对象的for in输出无序性
在上面的代码中我们发现,我们在对象之中定义在0和1之间的a神奇的在输出中到了0和1的后面,这是为什么呢? 事实上for是取出了value,即0,1,a并且对他们进行了排序,所以所谓无序其实只是针对对象中的无序,那我们再测试一下:
let b = {
1 : 3,
0 : 1,
a : 2
}
console.log(b[0], b[1],b[2]);
for(let s in b)
console.log(`${s}.${b[s]}`);
我们交换了1和0的定义位置,然后我们输出一下:
1 3 undefined
0.1
1.3
a.2
没错,输出没有任何变化,我们的数据储存在对象中没有顺序的,当然我们不考虑储存进去的顺序,而考虑它的逻辑顺序,输出的顺序是由for in 自己判断的,而数组的顺序也是自己由下标判断的。那么我们就找到了这两兄弟之间的区别了。
2.总结
数组和对象在JS之中其实都是类似键值对的形式,对象的储存是不考虑逻辑顺序的,但是数组是特别的,它是有逻辑的顺序进行储存的,它是一种线性顺序的储存结构,而由于一些特殊原因,我们可以将特殊的对象与数组一样使用数组下标的方式来使用,因为这类简单的对象就是以数组的方式储存的。但是数组就未必可以用对象的方式输出了。
那我们今天的小知识分享就结束了,如果可以请看到这的小伙伴给作者的辛苦点个小小的赞吧~~