没有JavaScript问题的开发人员访谈?这很难相信ð,在多个访谈中的一些常见类别中提出了棘手的问题。
但是面试官为什么要问这些问题?因为它们经常在现实情况下出现!这是如何:
1。网络开发中的类型胁迫
理解类型的胁迫在构建Web应用程序时,尤其是在字符串操作和URL编队时。
您期望什么输出?
console.log([] + []);
console.log([] + {});
console.log({} + []);
console.log({} + {});
答案:
-
""
(空字符串) "[object Object]"
-
0
(在浏览器中,由于Unary+
操作员的特殊性) NaN
JavaScript类型coercion
可以给出意外的结果,尤其是在arrays
和objects
之类的复杂类型中。
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
作为0
和b
作为数字。
13。暂时的死区
诸如React和Vue之类的框架需要清楚地了解块。
此代码将输出什么,为什么?
console.log(typeof undeclaredVariable);
console.log(typeof y);
let y = 1;
答案:
"undefined"
-
投掷参考
即使let
和const
声明被吊起,它们也没有初始化,导致了暂时的死区。
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
与对象中的属性匹配,然后分配了y
的x
的值。
JavaScript仍然是开发人员工具包中的基石,其细微差别通常是更深入理解的门户。
当您准备面试时,请记住,这些棘手的问题不仅是关于记忆的,而且要掌握语言的本质。
通过深入研究此类挑战,您不仅为潜在的面试做准备,而且还要丰富您的JavaScript水平。
好运,继续编码!