[英]Difference in efficacy between parseInt() and Number.isInteger() in following Javascript array scenario?
我正在研究freecodecamp.org的Javascript ES6编码问题,其中一个任务要求我使用箭头功能符号来:
我已经成功完成了该问题,但是通过使用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
不必是一个字符串。 看一下规范 ,第一步将第一个参数转换为字符串:
调用parseInt函数时,将执行以下步骤:
- 令inputString为ToString(string)。
parseInt
的问题之一是,如果它具有前导零,则在某些(旧)浏览器中可能被解释为八进制 ,而在其他(较新)浏览器中则可能被解释为以10为底。 因此,如果要支持上述旧浏览器,最好总是提供一个基数(作为第二个参数)或改用Number
。
就是说,在这种特殊情况下,这没有什么区别,因为对数字调用parseInt
永远不会导致前导零。
不过,我认为建议的答案还是有误导性的-因为您知道测试中使用的数字始终为正,因此使用Math.floor
不是parseInt
会更适合于此目的,因为您只是尝试获取下限值,而不是尝试将字符串转换为数字。
parseInt尝试将您传递给它的值转换为整数,如果使用此参数parseInt("30")
调用,它将返回给您一个数字30。 如果使用无法转换为parseInt("hello world")
之类的整数的值进行调用,它将返回NaN。
Number.isInteger验证给定值是否为返回真布尔值或假布尔值的整数。 Number.isInteger(1)
将返回true, Number.isInteger("hello world")
或Number.isInteger(3.14)
将返回false。
我不明白为什么如果整数已经是整数,我们为什么需要解析整数。
不用了 这是对parseInt
滥用。 他们应该将Math.floor
用作其预期目的。
为什么
parseInt()
不会因为参数要求输入字符串而引发错误?
因为它是一个旧的API,而且非常宽松。 它不会抛出错误,而只是将其参数强制转换为字符串,然后尝试解析该字符串。
我的主要问题:两者是否都可以接受?
不, parseInt
是绝对不能接受的。 您使用isInteger
找到了更好的解决方案。 他们不使用它的原因可能是isInteger
是ES6中新增的一个相对较新的函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.