每日挑戰,從Javascript面試題目了解一些你可能忽略的概念 – Day25

tags: ItIron2021 Javascript

前言

你好阿,大哥哥! 沒想到你能撐過非同步的連續攻擊!
不過一切就到此為止了,接著就由我鎖鏈的康妮來做你的對手吧!

鎖鏈的康妮

回味一下老梗,恭喜各位一路走到第25天,剩下的6天內容會是變為實際的應用題目,不再單一針對某個概念,反而會較為貼近白板題的情況(當然,難度比白板題可低多了,這系列並不涵蓋我實際遇過的白板題😂)。 馬上來看一下今天的題目吧!

本日題目與解釋

請你寫一個function isInteger(x),可以用來判斷x是否為整數

防雷圖~~

會動的鎖鏈康妮

題目看起來很簡單嘛! 阿不就寫個函數判斷是否是整數? 大概就像這樣吧

function isInteger(x) {
  return parseInt(x, 10) === x
}

isInteger(520) // true
isInteger(43.5) // false
isInteger(-35) // true

搞定! 我們明天見!

實際上你犯了很嚴重的錯誤,如果是筆試的問題且題目說明真的只有這樣,那我想以上的寫法問題不大(當然,還是有問題,等等說明),但如果這是在面對面口試拋出這樣的題目,以上的答案就特別不妥當了。
我有說這函數要回傳什麼嗎?這函數需要log出什麼訊息嗎?傳入的參數範圍你知道嗎? 是的,這些你都不知道,所以你不該貿然下手。
也許在文章中看起來你會覺得這根本他媽陷阱題,這我不否認,但實際上確認需求本來就是你該做的事情,因此在碰到這樣的題目時務必先釐清問題

  • 函數要做、要回傳什麼?
  • 傳入的參數有限制嗎?(例如有沒有需要處理edge cases)
  • 解法有什麼限制嗎?(例如時間複雜度、不能使用原生語法等)

OK,那我們進一步說明並重新定義題目

請你寫一個function isInteger(x),這函數最終會回傳一個boolean判斷x是否為整數,傳入的參數只會有數字,沒有時間複雜度與語法上的限制

這樣清楚多了,以下提供兩種常見的解法

  • 方法一: 原生語法

我在之前的文章就提過了,如果JS本身已經有配合的語法,你就不需要去自己刻,這個情境下可以使用原生的Number.isInteger來處理

console.log(Number.isInteger(12520.32))  // false
console.log(Number.isInteger(-77.0)) // true
console.log(Number.isInteger(1252065461313.42)) // false
  • 方法二: parseInt or Math.floor

第二種思路則是將數字無條件捨去後判斷他與原本的數字是否相同

let x = 12520.32
let y = -77.0
let z = 1252065461313.42

console.log(parseInt(x) === x) // false
console.log(parseInt(y) === y) // true
console.log(Math.floor(z) === z) // false

不過以上的解法都有缺陷,但這個缺陷來自JS本身,我們之前在浮點數陷阱的部份談過JS採用的標準,在這個標準下存在一個安全數範圍,也就是2的53次方-1 以及-2的53次方-1

Number.MAX_SAFE_INTEGER // 9007199254740991
Number.MIN_SAFE_INTEGER // -9007199254740991

超過這個範圍的數字在運算時就有可能會出現一些誤差,解法通常是透過一些第三方套件像是bigint.js等來處理,老樣子,後續的細節就交給你們啦!

本日核心觀念與總結

核心觀念

isInteger、MAX_SAFE_INTEGER & MIN_SAFE_INTEGER

總結

  • 收到問題時務必先釐清問題,不要貿然回答
  • 了解如何用基本方法判斷數字是否為整數
  • 了解MAX_SAFE_INTEGER & MIN_SAFE_INTEGER

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s