每日挑战,从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

本文章同步发布於个人部落格,有兴趣的朋友也可以来逛逛~!


<<:  [Day25]ISO 27001 附录 A.13 通讯安全

>>:  [DAY 27] _看门狗简介_视窗看门狗(1)

30天学会 Python-Day28: 选择档案

tkinter tkinter 是 Python 中用於制作 GUI 的套件 可以用 tkinter...

Sklearn读取自定的CSV k-means范例修改

数据集的使用,常常令人一头雾水,举例来说,iris dataset这个最常用的资料集。 用一行代码就...

ISO 27001 机房管理部份之二

定义 : ISO 27001 ISMS 导入适用范围:机房管理、网路管理、BPM、ERP系统开发及维...

[Day01] 写给现在与将来的主管

我相信,很少人是做好准备才当上主管。通常是凭自己的技术过硬、绩效超群而被赋予领导职,然後开始学管理。...