这里的类数组是指key为数字,value可以为其他类型的对象,他的实质还是对象只不过key(键)为数字。
而js中还有一个Object.values()方法,其描述为:方法返回一个给定对象自身的所有可枚举属性值的数组,值的顺序与使用for…in循环的顺序相同
先举个例子:
首先是用Object.values方法
var obj = {
0:'3',
1:{
key:'钥匙'
},
2:5,
}
console.log(Object.values(obj)) //[ '3', { key: '钥匙' }, 5 ]
接着是Array.from()
var obj = {
0:'3',
1:{
key:'钥匙'
},
2:5,
length:3 //array.from使用这个方法,对象中一定要有length这个属性来描述长度(也就是属性的个数),实际转化中会去掉
}
console.log(Array.from(obj)) //[ '3', { key: '钥匙' }, 5 ]
一眼看去这两个方法的用处简直一模一样,而且Array.from貌似更麻烦(因为还要加length属性),那么为什么要加这样的新方法呢?我们上面属性名用的是0,1,2。我们现在改变一下改成1,2,5试试:
还是一样先来看Object.values
var obj = {
1:'3',
2:{
key:'钥匙'
},
5:5,
}
console.log(Object.values(obj)) //[ '3', { key: '钥匙' }, 5 ]
这里我们可以看到输出并没有因为我们改了属性名而改变,我们继续看Array.from
var obj = {
1:'3',
2:{
key:'钥匙'
},
5:5,
length:3
}
console.log(Array.from(obj)) //[ undefined, '3', { key: '钥匙' } ]
这里的结果就大大不一样了,甚至还出现了undefined,而且我们的属性名为5的属性的值并没有显示出来了,我相信看到这里的朋友一定有所发现了,当我们用Object.values方法时,它只是将目标对象的属性的值一个一个拿出来然后给到数组中,并不会因为属性名而影响输出结果。
而Array.from方法则是将我们对象的属性作为下标(key为多少下标就是多少),而且length规定的是输出数组的长度,如果属性名(也就是数组中的下标)越界了(超过了length),那么数组中也是不会有该值的。属于length范围但是却不在obj属性中的值(也就是我们数组中的第一个)就是undefined。因为我们的对象中没有属性名为0的属性,那么数组中这个值就是undefined。