A
Array.from(A)
B
[].slice.apply(A)
C
[…A]
D
[].map.call(A, o => o)
正确答案:ABCD
Array.from(arr, mapfn,thisArg)方法,用于将两类可以把对象转换为真正的数组:类似数组的对象和可遍历的对象(部署了Iterator接口的,String,ES6新增的Map和Set)。
可以传3个参数,其中第一个是数组,必传;第二个是一个函数(类似map函数),对数组元素进行操作后再返回数组,可选;第三个是对于this关键字的指向,可选。
slice() 方法可从已有的数组中返回选定的元素。
返回值:返回一个新的数组,包含从 start 到 end (不包括该元素)的 arrayObject 中的元素。
说明
请注意,该方法并不会修改数组,而是返回一个子数组。如果想删除数组中的一段元素,应该使用方法 Array.splice()。
所以在这里就是对集合A应用slice,返回一个新的数组,不对数组做任何改变。
展开运算符,把A集合的元素展开后,用数组[]承载,返回新的数组。
map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。
map() 方法按照原始数组元素顺序依次处理元素。
注意: map() 不会对空数组进行检测。
注意: map() 不会改变原始数组。
所以map方法返回了一个新的数组,并且数组中每个元素是A里面的元素。
ES5中map会跳过空位但会保留这个值,ES6中将空位视为undefined
使用[].slice.apply(A),[].map.call(A)可以转为数组 但是无法把A中的元素放在数组里面
首先:只要使用[].slice.apply()不管里面的第一个参数是什么 这个对象都会返回一个数组
但是当参数中含有length属性的时候 会返回一个长度为属性值的数组 并且会把对象中下标<length的元素放到数组里面对应的下标位置中去
对于字符串:在执行[].slice.apply()的时候会把它包装成String对象 可以推测number类型和boolean类型也都会被包装
对于可迭代对象:与slice方法无关 太长了这里就不写了..大家可以自己试试
//下面是创建一个可迭代对象
var obj3 = {
a: 1,
b: 2,
Symbol.iterator{}//里面是创建可迭代对象的代码
[].slice.apply(obj3)//[] 可见这个方法和可迭代对象无关
得出结论:slice方法的工作原理是根据上下文对象中的length属性建立一个length长度的数组 然后寻找对象中key值为数字的属性并且添加到数组里面 对于没有length属性的对象 默认length=undefined 返回的数组为空
对于map:上面的代码 使用[].map.call()和[].slice.apply()的结果是一样的
可以推测map的工作原理和slice类似 大概是是根据上下文对象中的length属性建立一个length长度的数组 然后只遍历下标为数字的数组并且放到数组中对应下标的位置里 而且下标大于length的元素是不会被遍历的
map和set并不属于类数组对象
类数组对象:
(1)定义
拥有 length 属性
若干索引属性的任意对象
(2)举例
NodeList
HTML Collections
字符串
arguments
$ 返回的 jQuery 原型对象
(3)类数组对象转数组
新建数组,遍历类数组对象,将每个元素放入新数组
Array.prototype.slice.call(ArrayLike) 或 [].slice.call(ArrayLike)
Array.from(ArrayLike)
apply 第二参数传入,调用数组方法
另外Array.from处理对于类数组对象可用之外,对于Map和Set也并不排斥
只有AC是对的