我是 JavaScript 新手。我试图弄清楚为什么这不起作用:
function myFunction(){
document.getElementById("result").value=add(1,2);
}
function add(){
var sum = 0;
for(var i in arguments)
sum += i;
return sum;
}
这输出001
. 为什么?
我是 JavaScript 新手。我试图弄清楚为什么这不起作用:
function myFunction(){
document.getElementById("result").value=add(1,2);
}
function add(){
var sum = 0;
for(var i in arguments)
sum += i;
return sum;
}
这输出001
. 为什么?
您正在迭代键,请执行以下操作:
function add(){
var sum = 0;
for(var i in arguments)
sum += arguments[i];
return sum;
}
更具体地说,键是字符串,"0"
因此"1"
您的响应是初始 0 和后续键的串联。
此外,如果您对现代平台上的 javascript 感兴趣,以下内容非常清晰简洁。
function add(){
return [].reduce.call(arguments, function(a, b) {
return a+b;
});
}
console.log(add(1,2));
试试这个:
function add(){
var sum = 0, x = 0;
for(var i in arguments){
//the key is an index
if(!arguments.hasOwnProperty(i)) continue;
// try converting argument[i] to a number
x = +arguments[i];
// check if argument is a valid number
if(!isNaN(x)) {
sum += x;
}
}
return sum;
}
演示:http: //jsfiddle.net/vg4Nq/
这是另一种可能性。
function add() {
var numbers = [].slice.call(arguments),
sum = 0;
do {
sum += numbers.shift();
} while (isFinite(sum) && numbers.length);
return +sum;
}
console.log(add(1, 2, 3, 4, 5));
更新:这比reduce
. 如果我们希望对数据进行更多检查,我们也可以对此进行改进。
function add1() {
var numbers = [].slice.call(arguments),
sum = 0,
x;
do {
x = numbers.shift();
sum += (typeof x === "number" ? x : NaN);
} while (isFinite(sum) && numbers.length);
return +sum;
}
console.log("add1", add1(1, 2, 3, 4, 5));
console.log("add1", add1(1, 2, 3, 4, 5, ""));
console.log("add1", add1(1, 2, 3, 4, 5, "0xA"));
console.log("add1", add1(1, 2, 3, 4, 5, NaN));
console.log("add1", add1(1, 2, 3, 4, 5, Infinity));
console.log("add1", add1(1, 2, 3, 4, 5, -Infinity));
console.log("add1", add1(1, 2, 3, 4, 5, true));
console.log("add1", add1(1, 2, 3, 4, 5, false));
console.log("add1", add1(1, 2, 3, 4, 5, null));
console.log("add1", add1(1, 2, 3, 4, 5, undefined));
console.log("add1", add1(1, 2, 3, 4, 5, []));
console.log("add1", add1(1, 2, 3, 4, 5, {}));
我们可以在没有检查的情况下进行比较
function add2() {
return [].reduce.call(arguments, function (a, b) {
return a + b;
});
}
console.log("add1", add2(1, 2, 3, 4, 5));
console.log("add1", add2(1, 2, 3, 4, 5, ""));
console.log("add2", add2(1, 2, 3, 4, 5, "0xA"));
console.log("add2", add2(1, 2, 3, 4, 5, NaN));
console.log("add2", add2(1, 2, 3, 4, 5, Infinity));
console.log("add2", add2(1, 2, 3, 4, 5, -Infinity));
console.log("add2", add2(1, 2, 3, 4, 5, true));
console.log("add2", add2(1, 2, 3, 4, 5, false));
console.log("add2", add2(1, 2, 3, 4, 5, null));
console.log("add2", add2(1, 2, 3, 4, 5, undefined));
console.log("add2", add2(1, 2, 3, 4, 5, []));
console.log("add2", add2(1, 2, 3, 4, 5, {}));
引入的这些额外检查对性能有何影响?
让我们来看看,jsperf
随意将其他解决方案添加到性能测试中。- 我添加了其他人。
无论如何,我会避免for..in
在遍历arguments
对象时使用(以避免遍历可能已附加到的任何方法) ,arguments
并且会选择任何其他常用的Array
循环方法:for
、while
或forEach
reduce