JavaScript常见面试问题

EnElHuerto
EnElHuerto

第一部分

如果在面试中出现以下任何问题,看起来似乎挺难,有的甚至平常根本没有注意过。尽管如此,这些问题在使用中仍然有用:它们揭示了JavaScript的一些有趣的奇怪之处。

有关更多古怪的JavaScript功能,我建议您查看https://wtfjs.com

1.为什么Math.max()小于Math.min()?

下面这个问题看起来挺奇怪,但它却是是正确的

1
Math.max() < Math.min() // true

如果没有给出参数,则Math.min()返回infinity而Math.max()返回-infinity 。这只是max()和min()方法规范的一部分,但是选择背后有很好的逻辑。要了解原因,请查看以下代码:

1
2
3
4
5
6
Math.min(1) 
// 1
Math.min(1, infinity)
// 1
Math.min(1, -infinity)
// -infinity

2.为什么0.1 + 0.2 === 0.3返回false?

简而言之,它与JavaScript在二进制文件中存储浮点数的准确程度有关。如果您在GoogleChrome控制台中输入以下公式,您将获得:

1
2
3
4
5
6
0.1 + 0.2 
// 0.30000000000000004
0.1 + 0.2 - 0.2
// 0.10000000000000003
0.1 + 0.7
// 0.7999999999999999

如果您在程序中做的不是精准判断,那么它将不会影响你的程序,如果您在写程序时做的时精准判断‘===’,那么它将可能会给你的程序带来麻烦,不过我们有一些解决方案。

  • 转成整数类

    例如,如果您知道所需的最大精度(例如,如果您正在处理货币),则可以使用整数类型来存储该值。因此¥4.99 ,您可以存储499并执行任何方程式。然后,您可以使用result = (value / 100).toFixed(2) 返回字符串的表达式将结果显示给最终用户。

3.函数表达式与函数声明的不同之处是什么?

函数声明使用关键字function ,后跟函数的名称。相反,函数表达式以函数 名称和赋值运算符开头var ,let或者const后跟函数名称= 。这里有些例子:

1
2
3
4
5
6
7
8
9
10
11
// 函数声明
function sum(x, y) {
return x + y;
};

// 表达式方式声明
var sum = function(x, y) {
return x + y;
};
//函数表达式:ES6 +
const sum =(x,y)=>{ return x + y };

在使用中,关键的区别在于函数声明被提升,而函数表达式则没有。这意味着JavaScript解释器将函数声明移动到其作用域的顶部,因此您可以定义函数声明并在代码中的任何位置调用它。相比之下,您只能以线性顺序调用函数表达式:您必须在调用它之前定义它。

4. var,let和const有什么区别?

基本差异

  • 我想这是自ES6发布以来一直非常常见的面试问题,那些公司正在充分利用更现代的语法。var是第一版JavaScript中的变量声明关键字。但它的缺点导致在ES6中采用了两个新的关键词:let和const 。

  • 这三个关键字具有不同的重新赋值,提升和范围方法 - 因此我们将分别涵盖每个关键字。

  • 最基本的区别是,let并var同时可以重新赋值一个变量const不能。这是const控制一个变量不能被更改这个功能特别棒,它可以防止意外重新分配导致错误。注意,const它允许变量变异,这意味着如果它表示一个数组或一个对象,它们可以改变。您无法重新分配变量本身。

  • cosnt 的本质是它定义的一个变量不被允许重新分配内存地址

    声明提升差异

  • 使用var声明的变量总被提升到其作用域范围的顶部,即使它没有被赋值,就算它被赋值啦也没用,因为赋值的过程是在程序运行到其位置之后才被执行的,所以用var声明的变量在赋值之前打印结果为undefined 如下

    1
    2
    3
    4
    console.log(ddd)
    var ddd = 8
    VM4566:1 undefined
    undefined
  • let 和 const 为变量声明时候不会被提升到其变量作用域的顶部所以在赋值之前使用该变量会报错

    1
    2
    3
    4
    5
    console.log(ccc)
    let ccc = 8

    VM4623:1 Uncaught ReferenceError: Cannot access 'ccc' before initialization
    at <anonymous>:1:13

作用域

var是功能范围的,let并且const是块范围的:通常,块是花括号内的任何代码{},包括函数,条件语句和循环。为了说明差异,请查看以下代码:

1
2
3
4
5
6
7
8
9
10
11
var a = 0; 
let b = 0;
const c = 0;
if (true) {
var a = 1;
let b = 1;
const c = 1;
}
console.log(a); // 1
console.log(b); // 0
console.log(c); // 0

var 只在函数内才有函数块内部,才有块的概念

1
2
3
4
5
6
7
8
9
10
11
var a = 0; 
let b = 0;
const c = 0;
(function(){
var a = 1;
let b = 1;
const c = 1;
}())
console.log(a); // 0
console.log(b); // 0
console.log(c); // 0