在尝试学习一些基本的JS时,我正在构建一个Calculator对象,它应该添加/减去/除/多个接受任意数量参数的方法。这就是我所在的地方:
var Calculator = {}; //
Calculator.add = function () {
var addValue = 0;
for (var i = 0; i < arguments.length; i++) {
addValue = addValue + arguments[i];
}
return addValue;
}
Calculator.subtract = function () {
var subtractValue = 0;
for (var i = 0; i < arguments.length; i++) {
subtractValue = subtractValue - arguments[i];
}
return subtractValue;
}
console.log(Calculator.add(1,4));
console.log(Calculator.subtract(2,4)); // outputs -6. Should output -2. (2,4,6) should give -8 etc.
add方法有效,所以我进入了减法并很快意识到这个策略对我的其余方法都不起作用。毫无疑问,这是一个更聪明的方法来解决这个问题。期待您的建议。
谢谢。
答案 0 :(得分:2)
减去什么?什么是开头数?参数中的第一个元素?在那种情况下:
var subtractValue = arguments[0];
for (var i = 1; i < arguments.length; i++) {
subtractValue = subtractValue - arguments[i];
}
另外,我建议你将arguments.length保存在一个变量中:
for(var i = 1, l = arguments.length; i < l ; i ++)
这样你就不必每次循环读取数组的长度。这不会影响您的情况下的性能,但可能会使用更大的阵列。
答案 1 :(得分:1)
抱歉!我误解了你的问题,但现在它有效了。
请使用:
var Calculator = {}; //
Calculator.add = function () {
var returnVal = 0;
for (var i = 0; i < arguments.length; i++) {
returnVal += arguments[i];
}
return returnVal;
};
Calculator.subtract = function () {
var returnVal = arguments[0];
for (var i = 0; i < arguments.length - 1; i++) {
returnVal -= arguments[i + 1];
}
return returnVal;
};
alert(Calculator.add(1, 4, 5));
alert(Calculator.subtract(2, 4, 6)); // outputs -6.
答案 2 :(得分:1)
Calculator.add = function () {
var addValue = 0;
for (var i = 0; i < arguments.length; i++) {
addValue = addValue + arguments[i];
}
return addValue;
}
Calculator.subtract = function () {
var subtractValue = arguments[0];
for (var i = 1; i < arguments.length; i++) {
subtractValue = subtractValue - arguments[i];
}
return subtractValue;
}
答案 3 :(得分:1)
你可以做的是将参数列表中的第一个数字指定为要从中减去的主数字,然后循环除去第一个参数中的其他参数:
Calculator.subtract = function () {
var first = arguments[0];
for (var i = 1, l = arguments.length; i < l; i++) {
first -= arguments[i];
}
return first;
}
Calculator.subtract(12, 2, 4)); // outputs 6.
或者,也许您希望在对象中有一个运行总计,并使用一些很好的链接来处理提交的数字:
var Calculator = {
total: 0,
add: function () {
for (var i = 0; i < arguments.length; i++) {
this.total += arguments[i];
}
return this;
},
subtract: function () {
for (var i = 0; i < arguments.length; i++) {
this.total -= arguments[i];
}
return this;
},
display: function () {
console.log(this.total);
return this;
}
};
Calculator.add(1, 4).display(); // 5
Calculator.subtract(2, 1).display(); // 2
甚至:
Calculator.add(1, 4).subtract(2, 1).display(); // 2
答案 4 :(得分:1)
我认为这是一次学习练习,并且您希望在此过程中学习一些语言功能。
您可以将减法视为加法,并将符号反转,如2-4
= 2 + (-4)
。你有额外的逻辑,所以你可以在你的减法函数中使用它:
Calculator.subtract = function () {
// the first number stays the same, multiplying by 1 is short for parseInt.
var subtractValue = 1 * arguments[0];
// convert the rest of arguments to an array
var numbers = [].slice.call( arguments, 1 );
// invert the sign of the numbers by multiplying them * -1
numbers = numbers.map( function(n){ return -1*n; } );
// and apply the addition to these arguments...
var sum = this.add.apply( this, numbers );
// add the sum to the first number and return the result
subtractValue += sum;
return subtractValue;
}
简洁版
Calculator.subtract = function () {
var subtractValue = 1 * arguments[0];
var numbers = [].slice.call( arguments, 1 );
subtractValue += this.add.apply( this, numbers.map( function(n){ return -1*n; } ));
return subtractValue;
}
将来您可能希望重构添加以使用,例如,数组的reduce
方法。通过重复使用添加,您可以避免在不同位置重写两个for
循环。只是更新加法和减法仍然没有改变。
Calculator.add = function () {
var numbers = [].slice.call( arguments );
return numbers.reduce( function(num, prev){ return prev + num } )
}
答案 5 :(得分:0)
这可能是更好的选择。它从第一个参数
中减去所有其他参数 var subtractValue = arguments[0]; // add try catch in case no arguments are passed
for (var i = 1; i < arguments.length; i++) {
subtractValue = subtractValue - arguments[i];
}
return subtractValue;
输出:
console.log(Calculator.subtract(2,4)); // outputs -2
console.log(Calculator.subtract(6,4,1)); // outputs 1
console.log(Calculator.subtract(10,1,1,1,1,1,1,1)); // outputs 3