一般使用下面的方法来将 arguments 转换成数组:css
Array.prototype.slice.call(arguments);
还有一个更简短的写法:数组
[].slice.call(arguments);
在这里,只是简单地调用了空数组的 slice 方法,而没有从 Array 的原型层面调用。app
为何上面两种方法能够转换呢?函数
首先,slice 方法获得的结果是一个数组,参数即是 arguments。事实上,知足必定条件的对象都能被 slice 方法转换成数组。看个例子:this
const obj = { 0: "A", 1: "B", length: 2 }; const result = [].slice.call(obj); console.log(Array.isArray(result), result);
function foo() { bar.apply(this, arguments); } function bar(a, b, c) { // logic }
Array.from()
是个很是推荐的方法,其能够将全部类数组对象转换成数组。prototype
数组具备一个基本特征:索引。这是通常对象所没有的。code
const obj = { 0: "a", 1: "b" }; const arr = [ "a", "b" ];
咱们利用 obj[0]
、arr[0]
都能取得本身想要的数据,但取得数据的方式确实不一样的。obj[0]
是利用对象的键值对存取数据,而arr[0]
倒是利用数组的索引。事实上,Object 与 Array 的惟一区别就是 Object 的属性是 string,而 Array 的索引是 number。对象
function func() { console.log(...arguments); } func(1, 2, 3);
执行结果是:blog
1 2 3
简洁地讲,扩展操做符能够将 arguments 展开成独立的参数。索引