parseInt() 和 Number.isInteger() 在以下 Javascript 数组场景中的功效差异?

Difference in efficacy between parseInt() and Number.isInteger() in following Javascript array scenario?

我正在解决 freecodecamp.org 的 Javascript ES6 编码问题,其中一个问题要求我使用箭头函数表示法来:

  1. 取一个实数数组。
  2. 仅将正整数过滤到新数组中,并且
  3. 将这些正整数平方。

我已成功完成问题,但通过使用 Numbers.isInteger() 过滤原始数组来构建步骤 2 的代码。 Freecodecamp.org 提供的答案使用了 parseInt()。

我不明白为什么我们需要解析整数,如果它们已经是整数,也不明白为什么 parseInt() 不会抛出错误,因为它的参数要求一个字符串。

我的主要问题:两者是否同样可以接受?一个人会让我在路上遇到更多麻烦吗?

我发现的唯一密切相关的 stackoverfow 是 (这有点帮助)。下面是我的代码,后面是 freecodecamp.org 提供的答案代码。注意:我知道我的代码中有一些额外的步骤。我不是箭头符号的超级粉丝,并且仍在改进我的代码组织!


我的代码::

const realNumberArray = [4, 5.6, -9.8, 3.14, 42, 6, 8.34, -2];

const squareList = (arr) => {

"use strict";

// dictates what numbers are filter()'d out of original array

const checkElement = (value) => value > 0 && Number.isInteger(value) == true;

const integersOnly = arr.filter(checkElement); //filters ONLY positive integers into new array

提供的答案代码::

const realNumberArray = [4, 5.6, -9.8, 3.14, 42, 6, 8.34, -2];

const squareList = (arr) => {

"use strict";

const squaredIntegers = arr.filter( (num) => num > 0 && num % parseInt(num) === 0 ).map( (num) => Math.pow(num, 2) );

文档有点误导 - parseInt 的第一个参数 没有 是一个字符串。查看 specification,第一步将第一个参数转换为字符串:

When the parseInt function is called, the following steps are taken:

  1. Let inputString be ToString(string).

parseInt 的一个问题是,如果它有一个前导零,它可能在某些(旧的)浏览器中被解释为 octal,而在其他(较新的)浏览器中被解释为基数 10 ) 浏览器。因此,如果您想支持上述旧浏览器,最好始终提供一个基数(作为第二个参数)或使用 Number

也就是说,在这种特殊情况下,这没有区别,因为对数字调用 parseInt 永远不会导致前导零。

不过,我认为推荐的答案有点误导 - 因为您知道测试中使用的数字总是正数,所以使用 Math.floor 比 [=10] 更合适=] 用于此目的,因为您只是想获取底值,而不是尝试将字符串转换为数字。

parseInt 尝试将您传递给它的值转换为整数,如果您使用此参数 parseInt("30") 调用它,它将 return 将值 30 作为数字传递给您。如果您使用无法转换为整数的值调用它,例如 parseInt("hello world"),它将 return NaN。

Number.isInteger 验证给定值是否为整数 return 真或假布尔值。 Number.isInteger(1) 将 return 为真,Number.isInteger("hello world")Number.isInteger(3.14) 将 return 为假。

I do not see why we would need to parse integers if they are already integers.

你不需要。这是对 parseInt 的滥用。他们应该使用 Math.floor 而不是他们的预期目的。

Why parseInt() does not throw an error since its parameter asks for a string?

因为是旧的API,而且很宽容。它不会抛出错误,而只是将其参数强制转换为字符串,然后尝试对其进行解析。

My primary question: Are both equally acceptable?

不行,parseInt是绝对不能接受的。您使用 isInteger 找到了更好的解决方案。他们没有使用它的原因可能是isInteger是一个相对较新的功能,是ES6添加的。