关于Array.prototype.splice的疑问:教程代码是否存在错误?
问题分析与解答
你观察得非常仔细,这确实是教程里的错误,而且是两处明显的错误,咱们一步步拆解来看:
错误1:[1]的写法完全无意义且错误
Array.prototype.splice的第一个参数要求是数字类型的起始索引,而这里传入了[1](一个单元素数组)。虽然JavaScript会做隐式类型转换,Number([1])的结果是1,但这种写法完全是多余的,属于概念混淆或者笔误——直接写1才是符合API规范的正确写法,用数组包裹没有任何合理的场景。
错误2:用splice(1)会跳过第一个参数,违背函数的累加意图
你说得没错,splice(1)的作用是从索引1的位置开始,移除后续所有元素,并返回这些被移除的元素。这就导致values变量只会拿到add函数从第二个参数开始的值,第一个参数直接被排除在外,根本无法实现“累加所有传入参数”的功能。
另外补充一点:splice是会修改原对象的方法,用它处理arguments会改变这个类数组对象本身,这是完全不必要的副作用,我们应该用不会修改原对象的方法来转换arguments。
正确的实现方式
如果要实现一个累加所有传入参数的add函数,有几种更合理的写法:
方式1:转换arguments为数组(兼容ES5)
function add() { var values = Array.prototype.slice.call(arguments); // 用slice获取所有元素,不修改原arguments var total = 0; for(var value of values) { total += value; } return total; }
方式2:ES6剩余参数(更简洁)
function add(...values) { return values.reduce((total, val) => total + val, 0); }
内容的提问来源于stack exchange,提问作者Julius Dzidzevičius
相关产品推荐
相关产品推荐

