[英]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.