ES5的方法
主要借用[].slice.call()
实现
var foo = function() {
var arr = [].slice.call(arguments)
var result = Object.prototype.toString.call(arr)
console.log(arr) //[]
}()
ES6的方法
- 使用
Array.from
, 值需要对象有length属性, 就可以转换成数组
const arrayLike = {
length: 5
}
let arr2 = Array.from(arrayLike)
//[undefined, undefined, undefined, undefined, undefined]
- 使用展开运算符
但是展开运算符只能将某些数据结构转换成数组, 因为本质是调用遍历器接口(Symbol.iterator
),如果一个对象没有部署这个接口,就无法转换 --- 阮一峰ES6
// arguments对象
function foo() {
var args = [...arguments];
}
// NodeList对象
[...document.querySelectorAll('div')]
兼容写法
const toArray = (() => Array.from ? Array.from : obj => [].slice.call(obj))();
Demo
let arrayLike = {
'0': 'a',
'1': 'b',
'2': 'c',
length: 3
};
// ES5的写法
var arr1 = [].slice.call(arrayLike); // ['a', 'b', 'c']
// ES6的写法
let arr2 = Array.from(arrayLike); // ['a', 'b', 'c']