JavaScript棘手的采访问题2023
#javascript #网络开发人员 #面试 #softwareengineering

没有JavaScript问题的开发人员访谈?这很难相信ð,在多个访谈中的一些常见类别中提出了棘手的问题。

但是面试官为什么要问这些问题?因为它们经常在现实情况下出现!这是如何:

1。网络开发中的类型胁迫

理解类型的胁迫在构建Web应用程序时,尤其是在字符串操作和URL编队时。

您期望什么输出?

console.log([] + []);
console.log([] + {});
console.log({} + []);
console.log({} + {});

答案:

  • ""(空字符串)

  • "[object Object]"

  • 0(在浏览器中,由于Unary +操作员的特殊性)

  • NaN

JavaScript类型coercion可以给出意外的结果,尤其是在arraysobjects之类的复杂类型中。

2。财务应用中的精确困境

即使是轻微的差异也可能导致基于金融的应用程序的重大问题。

0.1 + 0.2等于0.3?

console.log(0.1 + 0.2 === 0.3);

答案:false

浮点算术的精度问题0.1 + 0.2导致数字略大于0.3。

3。 JavaScript的自动插入

您是否曾经想过为什么似乎正常工作的功能会给您带来意外的结果?分号在JavaScript中的行为可能是罪魁祸首。

以下功能返回什么?

function getNumber() {
  return 
  {
    value: 23
  };
}
console.log(getNumber());

答案:undefined

自动半插入插入导致返回被视为独立语句,因此该功能返回undefined

4。可变提升的奥秘

对提升的深度掌握至关重要,尤其是当初始化不按预期的方式行事时。

你能弄清楚怎么了吗?

var x = 21;
var girl = function () {
    console.log(x);
    var x = 20;
};
girl();

答案:undefined

由于可变吊装,在执行console.log时声明了函数内部的可变x。因此,其价值为undefined

5。棘手的增量操作

简单的算术有时会混淆开发人员。

您可以预测输出吗?

var num = 8;
function fun() {
    num += 7;
    num--;
    console.log(num);
}
fun();

答案:14

该功能首先将7添加到num(15),然后将其减少1。

6。难以捉摸的逗号

在编写用于顺序数据处理的脚本时,有时重要的是要知道如何在一行上做一个以上的事情。

您知道它如何评估其操作数吗?

var val = (1, 2, 3, 4);
console.log(val);

答案:4

逗号操作员评估其每个操作数并返回最后一个的值。

7。大规模应用中的范围

使用多个库处理大型应用程序时,正确范围的变量变得至关重要。

考虑以下代码:

var b = 5;
(function foo() {
    var b = 6;
    console.log(b);
})();
console.log(b);

答案:

  • 6

  • 5

iife(立即调用函数表达式)具有自己的范围,而foo中的可变b不影响外部变量b

8。现代网络框架中的上下文处理

在现代Web应用程序开发中,尤其是在诸如React之类的框架中,保持回调的上下文是必不可少的。

为什么这个回调会失去上下文?

let obj = {
  value: 'hello',
  print: function(callback) {
    callback();
  }
};

function sayValue() {
  console.log(this.value);
}

obj.print(sayValue);

答案:undefined

sayValue函数无上下文调用,因此this.value不参考obj.value

9。订单在脚本加载中

使用基于插件的体系结构进行构建时,加载脚本的方式变得非常重要。

您能弄清此代码的问题吗?

function bar() {
    return foo;
    foo = 10;
    function foo() {}
    var foo = '11';
}
console.log(typeof bar());

答案:function

由于提升,foo的功能声明移至返回语句上方的顶部,使其成为返回的值。

10。处理保留系统中的稀疏阵列

稀疏阵列在设计诸如剧院座椅预订之类的系统时可能是一个问题。

JavaScript如何处理此示例中的稀疏数组?

var a = [1, 2, 3];
a[10] = 10;
console.log(a[6]);

答案:undefined

阵列a现在的长度为11,但只有索引0-2和10具有值。所有其他都是undefined

11。动态形式的解析操作

在动态调查表中,基于用户输入的数据操作可能变得棘手。

您可以解释输出吗?

let arr = [1, 2, 3];
let res = arr.map(parseInt);
console.log(res);

答案:[1, NaN, NaN]

map将三个论点传递给回调:(currentValue, index, array)parseInt可以进行两个参数:弦和radix,这会导致意外结果。

12。 CMS和可变分配

在CMS中工作可能需要基于用户输入的即时变量定义。

该代码的输出是什么?

let a = (b = 3) - 3; 
console.log(a, typeof b);

答案:0, "number"

b的值设置为3,然后减去,将a作为0b作为数字。

13。暂时的死区

诸如React和Vue之类的框架需要清楚地了解块。

此代码将输出什么,为什么?

console.log(typeof undeclaredVariable);
console.log(typeof y);
let y = 1;

答案:

  • "undefined"

  • 投掷参考

即使letconst声明被吊起,它们也没有初始化,导致了暂时的死区。

14。 UI组件中的共享状态

在创建UI库时,确保单个组件分享意外状态不至关重要。

以下代码日志将是什么?

let arr = new Array(3).fill([]);
arr[0].push(10);
console.log(arr);

答案:[[10], [10], [10]]

对数组的相同引用均在所有位置中填充。修改一个修改所有内容。

15。破坏API响应

破坏可以简化使用API​​响应时的数据提取。

您可以解释这种破坏性操作的结果吗?

let {x, x: y} = {x: 23};
console.log(y);

答案:23

在这里,x与对象中的属性匹配,然后分配了yx的值。

JavaScript仍然是开发人员工具包中的基石,其细微差别通常是更深入理解的门户。

当您准备面试时,请记住,这些棘手的问题不仅是关于记忆的,而且要掌握语言的本质。

通过深入研究此类挑战,您不仅为潜在的面试做准备,而且还要丰富您的JavaScript水平。

好运,继续编码!