Array.prototype.slice.apply(arguments)和Array.from(arguments)
程序员文章站
2022-05-02 17:25:56
...
题目描述
函数 useArguments 可以接收 1 个及以上的参数。请实现函数 useArguments,返回所有调用参数相加后的结果。本题的测试参数全部为 Number 类型,不需考虑参数转换。
示例1
输入
1, 2, 3, 4
输出
10
方法1.
function useArguments() {
var sum=0;
for(var i=0;i<arguments.length;i++){
sum+=arguments[i];
}
return sum;
}
方法2.
function useArguments() {
var arr=Array.prototype.slice.call(arguments);
return arr.reduce(function(total,currentval){
return total+currentval;
})
}
方法3.
function useArguments() {
var arr=Array.from(arguments);
return arr.reduce(function(total,currentval){
return total+currentval;
});
}
例证:
补充知识点:
Array.prototype.slice.apply(arguments, [1])
arguments参数
生成
JavaScript在创建函数时,会自动生成一个Arguments对象实例arguments,可以用数组下标的方式”[]”引用arguments的元素。arguments.length为函数实参个数,arguments.callee引用函数自身。-
特性:
arguments对象和Function是分不开的。因为arguments这个对象不能显式创建,arguments对象只有函数开始时才可用。
使用方法:
虽然arguments对象并不是一个数组,但是访问单个参数的方式与访问数组元素的方式相同
Array.prototype.slice.apply(arguments)用意
直接调用arguments.slice()将返回一个”Object doesn’t support this property or method”错误,因为arguments不是一个真正的数组。调用Array.prototype.slice.apply(arguments)的意义就在于它能将函数的参数对象转化为一个真正的数组。
Array.prototype.slice.apply(arguments, [1])用意
首先这段代码的目的是为了拿到参数里除第一个以外后面的所有参数。
现在arguments 不是数组,所以不能直接调用slice方法,在JavaScript 中借用其它对象的方法可以通过apply或者call,以call为例,上述例子应该改写为:
// 需要借用的方法slice在Array.prototype 上,然后call接受两个参数,第一个是需要借用方法的对象,第二个是传进方法的参数,也就是1
Array.prototype.slice.call(arguments, 1)
// 也可以写成
[].slice.call(arguments, 1)
- 1
- 2
- 3
- 4
apply方法与call方法是一样的,区别只是传参的形式,需要把方法参数按数组形式传进:
Array.prototype.apply(arguments, [1])
推荐阅读
-
JS函数内部属性之arguments和this实例解析
-
JS 关于 bind ,call,apply 和arguments p8
-
函数内部属性之arguments和this
-
JavaScript中arguments和this对象用法分析
-
JS函数内部属性之arguments和this实例解析
-
arguments.callee php中修改浏览器的User-Agent来伪装你的浏览器和操作系统
-
from 1 to 2 positional arguments but 3 were given和cannot import name 'Bar' from 'pyecharts'的原因
-
函数内部属性之arguments和this
-
函数式JavaScript:.apply()、.call() 和arguments对象
-
JavaScript 之arguments、caller 和 callee 介绍