JavaScript九大面试问题集锦,助你顺利通关!
人们认为JavaScript是最适合初学者的语言。一部分原因在于JavaScript在互联网中运用广泛,另一部分原因在于其自身特性使得即使编写的代码不那么完美依然可以运行:无论是否少了一个分号或是内存管理问题,它都不像许多其他语言那样严格,但在开始学习之前,要确保你已经知道JavaScript的来龙去脉,包括可以自动完成的事情和“幕后”的操作。 本文将介绍一些面试时关于JavaScript的常见问题,以及一些突发难题。当然,每次面试都是不同的,你也可能不会遇见这类问题。但是知道的越多,准备的就越充分。 第一部分:突发难题 如果在面试中突然问到下列问题,似乎很难回答。即便如此,这些问题在准备中仍发挥作用:它们揭示了JavaScript的一些有趣的功能,并强调在提出编程语言时,首先必须做出的一些决定。 了解有关JavaScript的更多功能,建议访问https://wtfjs.com。 1. 为什么Math.max()小于Math.min()? Math.max()> Math.min()输出错误这一说法看上去有问题,但其实相当合理。 如果没有给出参数,Math.min()返回infinity(无穷大),Math.max()返回-infinity(无穷小)。这只是max()和min()方法规范的一部分,但选择背后的逻辑值得深议。了解其中原因,请看以下代码:
如果-infinity(无穷小)作为Math.min()的默认参数,那么每个结果都是-infinity(无穷小),这毫无用处! 然而,如果默认参数是infinity(无穷大),则无论添加任何参数返回都会是该数字 - 这就是我们想要的运行方式。 2. 为什么0.1+0.2不等于0.3 简而言之,这与JavaScript在二进制中存储浮点数的准确程度有关。在Google Chrome控制台中输入以下公式将得到:
如果是简单的等式,对准确度没有要求,这不太可能产生问题。但是如果需要测试相等性,即使是简单地应用也会导致令人头疼的问题。解决这些问题,有以下几种方案。 (1) Fixed Point固定点 例如,如果知道所需的最大精度(例如,如果正在处理货币),则可以使用整数类型来存储该值。因此,可以存储499而非4.99美元,并在此基础上执行任何等式,然后可以使用类似result =(value / 100).toFixed(2)的表达式将结果显示给最终用户,该表达式返回一个字符串。 (2) BCD代码 如果精度非常重要,另一种方法是使用二进制编码的十进制(BCD)格式,可以使用BCD库(https://formats.kaitai.io/bcd/javascript.html)访问JavaScript。每个十进制值分别存储在一个字节(8位)中。鉴于一个字节可以存储16个单独值,而该系统仅使用0-9位,所以这种方法效率低下。但是,如果十分注重精确度,采用何种方法都值得考量。 3. 为什么018减017等于3? 018-017返回3实际是静默类型转换的结果。这种情况,讨论的是八进制数。 (1) 八进制数简介 你或许知道计算中使用二进制(base-2)和十六进制(base-16)数字系统,但是八进制(base-8)在计算机历史中的地位也举足亲重:在20世纪50年代后期和 20世纪60年代间,八进制被用于简化二进制,削减高昂的制造系统中的材料成本。 不久以后Hexadecimal(十六进制)开始登上历史舞台: (2) 如今的八进制数 但在现代编程语言中,八进制又有何作用呢?针对某些案例,八进制比十六进制更具优势,因为它不需要任何非数字(使用0-7而不是0-F)。 一个常见用途是Unix系统的文件权限,其中有八个权限变体:
出于相似的原由,八进制也用于数字显示器。 (3) 回到问题本身 在JavaScript中,前缀0将所有数字转换为八进制。但是,八进制中不使用数字8,任何包含8的数字都将自动转换为常规十进制数。 因此,018-017实际上等同于十进制表达式:18-15,因为017使用八进制而018使用十进制。 第二部分:常见问题 本节中,将介绍面试中一些更加常见的JavaScript问题。第一次学习JavaScript时,这些问题容易被忽略。但在编写最佳代码时,了解下述问题用处颇大。 4. 函数表达式与函数声明有哪些不同? 函数声明使用关键字function,后跟函数的名称。相反,函数表达式以var,let或const开头,后跟函数名称和赋值运算符=。请看以下代码:
(编辑:ASP站长网) |