说我正在创建一个将一些数字加在一起的函数,并且我想验证它们实际上都是数字。
我正在这样做:
function addNumbers(x, y) {
if (typeof x == 'number' || typeof y == 'number') {
// do something..
}
}
如果我有两个以上的数字,这似乎不切实际。 什么是检查多个数字的更好方法?
答案 0 :(得分:3)
您可以将它们放在数组中,并使用布尔标志使用Array.prototype.every
来检查是否都是数字(并检查NaN
,因为typeof NaN === 'number'
):
function addNumbers(...args) {
var all_numbers = args.every(a => typeof a == 'number' && !isNaN(a));
if (all_numbers) {
var sum = 0;
args.forEach(n => sum += n);
console.log(sum);
} else {
console.log('something is not right!');
}
}
addNumbers(5, 6);
addNumbers(5, 6.2);
addNumbers(5, 6, NaN);
addNumbers(5, 6, []);
addNumbers(5, 6, {});
addNumbers(5, '6');
addNumbers('5', 6);
答案 1 :(得分:1)
您可以使用...
rest参数语法将get输入作为数组使用,然后使用Array.prototype.reduce
对它们求和,同时可以使用+
将元素转换为数字运算符并添加它们:
function addNumbers(...nums) {
return nums.reduce((sum, num) => sum + +num)
}
console.log(addNumbers(1, 2, "3", 4));
或者,如果您想跳过非数字(如果使用第一个代码段,则会产生NaN
),只需在添加前检查类型,如果数字很好,否则请用{{ 1}}:
0
答案 2 :(得分:1)
我认为它的可读性更好,请使用Array.prototype.every
,Number.isInteger
和Array.prototype.reduce
。
我不确定您要如何处理错误,因此我们只记录它们(及其结果);
// consider floating point
const isNumber = n => typeof n == 'number' && !isNaN(n)
const addNumbers = (...args) => {
const isValid = args.every(isNumber);
// const isValid = args.every(Number.isInteger);
if (!isValid) {
console.log('Error');
return;
}
const sum = args.reduce((sum, curr) => sum + curr, 0);
console.log(sum);
return sum;
}
addNumbers(5, 6);
addNumbers(5, 6, NaN);
addNumbers(5, '6');
addNumbers('5', '6');
addNumbers('5', 6);
addNumbers(5.5, 6);
addNumbers(5.5, 6, 6.4, 65);
addNumbers(5.5, 6, {});
答案 3 :(得分:0)
您可以将所有数字推入和数组,并在该数组上循环并添加它们。
let arr = [1,2,3,4]; #be it your array
function addNumbers(arr) {
let sum=0;
arr.map(item => {
if(typeof item === 'number') {
sum=sum+item;
}
else {
return item+' is not a number in given array';
}
return sum;
});
答案 4 :(得分:0)
如果性能不是这里的问题:
function testN(){
if(!Array.from(arguments).every((d)=>typeof d === "number")){
return;
}
console.log("pass");
//do something;
}
用您想做的任何事情代替“做某事”。 可以使用否定的“某些”方法,该方法会更早终止。任何适合您的。