检查多个输入是否为数字类型

3

假设我正在创建一个函数来将一些数字相加,并且我想验证它们是否确实是数字。

我正在这样做:

function addNumbers(x, y) {     
    if (typeof x == 'number' || typeof y == 'number') {
        // do something..
    }        
}

如果我有超过两个数字,使用此方法似乎不现实。有更好的方法来检查多个数字吗?


1
首先将它们作为数组传递到函数中,这样您就可以轻松地循环遍历它。 - misorude
你尝试过像 addNumbers(10,11) 这样添加吗? - Rizkiramadhani
请在翻译时包括输入内容、存储值的方式和位置,以及如何使用这些值调用 addNumbers 函数。这样我们可以更快地帮助您。 - Ghassen Louhaichi
我来澄清一下,我希望addNumbers函数可以接受任意数量的值(仅用于学习目的,而非实际应用),如果其中任何一个不是数字,它将抛出一个错误。例如,addNumber(1, 2, 3, 'twenty')。 - Omer Zano
5个回答

3
你可以将它们放在一个数组中,并使用布尔标志检查是否所有内容都是数字,使用Array.prototype.every(并检查 NaN ,因为 typeofNaN ==='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);


我不确定在有两个以上的输入时,这种方法如何解决问题。 - Ghassen Louhaichi
2
@GhassenLouhaichi 使用 ...args 可以解决这个问题。 - DjaouadNM
1
请尝试使用 isNaN 代替。 - Dennis Vash
尝试使用"every"代替 - TaiNS
@DennisVash isNaN([]) is false. @DennisVash isNaN([]) 是假的。 - DjaouadNM
显示剩余5条评论

1
你可以使用... rest参数语法将输入作为数组获取,然后使用Array.prototype.reduce对它们进行求和,同时您可以使用+运算符将元素转换为数字并加起来:

function addNumbers(...nums) {     
    return nums.reduce((sum, num) => sum + +num)
}
console.log(addNumbers(1, 2, "3", 4));

或者,如果您想跳过非数字(使用第一个代码片段将生成NaN),只需在添加之前检查类型,如果是数字,则可以继续,否则请用0替换:

function addNumbers(...nums) {     
  return nums.reduce((sum, num) => sum + (!(typeof(num) === "number") ? 0 : +num));
}
console.log(addNumbers(1, 2, "3", 4, "non-number"));


如果他想防止意外包含文本输入,该怎么办?你的解决方案会返回 NaN - Ghassen Louhaichi
1
@GhassenLouhaichi 是的,我意识到了我的错误并添加了第二个版本。 - Fullstack Guy

1
我认为更易读的形式是使用Array.prototype.everyNumber.isIntegerArray.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, {});


1
不适用于浮点数 Number.isInteger(5.2) 为 false - DjaouadNM

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;
});

0
如果性能不是问题:
function testN(){
    if(!Array.from(arguments).every((d)=>typeof d === "number")){
        return;
    }
    console.log("pass");
    //do something;
}

用任何你想做的东西替换“do something”。 可以使用否定的“some”方法,这样会更早地终止。选择适合你的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接