类数组,Array.from

类数组,Array.from


类数组
类数组是与数组格式相似,不具备数组方法且必须有length属性的为类型,(特殊的对象,继承与Object)不是JS内置的类型。注:下标和数组一样必须从0开始,否则在转化为数组,类数组length为1时,会返回一个包含空数据的一个数组

补充
Array.from.length // 1 
// 对于方法的length,length指的是方法形参的个数,Array.from的第一个参数是必填的,剩余参数是通过arguments来获取的。
// 如果类数组不是和数组一样以下标形式为key,将转化成元素全为undefined的数组
const obj = {
	a: 1,
	b: 2,
	length: 2
} 
Array.from(obj); // [undefined, undefined]
// 类数组
const obj = {
	0: 1,
	1: 2,
	2: 3,
	length: 3
}
// 下标不从0,开始 length 为1
const obj = {
	1: 1
	length: 1
}
// Array.prototype.slice.call(obj) 类数组必须具有length
Array.prototype.slice.call(obj);  // [empty]
// 下标不从0,开始 length 为 2
const obj = {
	1: 1
	length: 2
}
Array.prototype.slice.call(obj);  // [empty, 1]

Array.from
可以使用 Arrary.from 将类数组和可迭代的数据转化为数组。

const obj = {
	0: 1,
	1: 2,
	2: 3,
	length: 3
}
Array.from(obj); // [1,2,3]

Array.from 或根据 length 的值截裁或补充,补充的是 undefined。

// length = 0
const obj = {
	0: 1,
	1: 2,
	2: 3,
	length: 0
}
Array.from(obj); // []
// 没有 length
const obj = {
	0: 1,
	1: 2,
	2: 3
}
Array.from(obj); // []
// length 值小于类数组实际值数量
const obj = {
	0: 1,
	1: 2,
	2: 3,
	length: 2
}
Array.from(obj); // [1, 2]
// length 值大于类数组实际值数量
const obj = {
	0: 1,
	1: 2,
	2: 3,
	length: 4
}
Array.from(obj); // [1, 2, 3, undefined]

如果类数组中实现数组的push

// 没有 length
const obj = {
	0: 1,
	1: 2,
	2: 3,
	push: [].push
}
obj.push(3);
// 结果
const obj = {
	0: 3,
	1: 2,
	2: 3,
	length: 1
	push: [].push
}

之所以会这样,是因为数组中push方法是数组的length有关,每次push都会累加length,但对于没有length属性的数据来说,默认当数据的length为0,修改下标为0的属性值,并累加length,转化为类数组。

// 有length属性
const obj = {
	0: 1,
	1: 2,
	2: 3,
	length: 3
	push: [].push
}
obj.push(3);
// 结果
const obj = {
	0: 3,
	1: 2,
	2: 3,
	3: 3
	length: 4
	push: [].push
}

如果是类数组,会根据当前的length值,修改相应下标为(length - 1)的属性值,并累加length。

题:将
const obj = {
	0: 1,
	1: 2,
	length: 2
}
转化为
const objArr = [
	{
		id: 0,
		classes: 1
	},
	{
		id: 1,
		classes: 1
	}
]
// 一般实现方法
const arr =  Array.from(obj);
const objArr = arr.map((item, index) => {
	return {
		id: index,
		classes: item
	}
});
// 但是 Array.from 有三个参数:类数组,回调函数,this
const objArr = Array.from(obj, (item, index) => {
	return {
		id: index,
		classes: item
	}
});
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值