JavaScript 面试问题:常见问题

现在,每个人都有自己的JavaScript Gotchas列表,但像JavaScript是案例敏感这样的东西不是一个真正的 gotcha。

一个真正的gotcha对我来说是当1 == 11 == 1是真的,但[] == []不是真的。

在本指南中,我们将探讨一些你可能在JavaScript采访中发现的常见问题,面试者可能不会直接问这些问题,但他们可能会问你一些与他们相关的问题或涉及到他们的问题。

放下 vs. 放下

这是最基本的Gotchas之一 - 起初,关键字varlet(LINK0)看起来和我非常相似,我不能说有任何差异。

 1// let
 2for(let i=0; i<10; i++) {
 3  //...
 4}
 5console.log(i) // Reference Error: i is not defined
 6
 7// var
 8for(var j=0; j<10; j++) {
 9  //...
10}
11console.log(j) // 10

一个大的区别是让我们是区块范围的,这意味着它局限于它所定义的任何区块。为了让console.log知道i是什么,你需要将ifor循环中提起。

附加 vs 合并

11 + 1; // 2, obviously
21 + "1"; // "11"

正如你所看到的,JavaScript 会将数字转换为字符串。

11 - "1"; // 0 (number)
21 * "1"; // 1 (number)
31 / "1"; // 1 (number)
4"1" * "1"; // 1 (yep, still a number)

不,事实上,JavaScript在大多数情况下会将字符串转换为数字。在+操作员的情况下,它是连接而不是添加的。

哥德拉斯

NaN不是一个数字的意思,它是JavaScript中处理的最令人困惑的数字之一(数字)。

1NaN === NaN; // false
2NaN == NaN; // false as well
3typeof NaN; // number
4"" == NaN; // false

事实上,任何等于NaN的东西都是虚假的,尽管有很多东西是不是一个数字

 1isNaN("string"); // true - what we would expect, as a string is not a number
 2isNaN(123); // false - also expected
 3// false means it's a number, right?
 4
 5isNaN(""); // false - hmm...
 6isNaN("45"); // false - this is a string, I thought
 7isNaN([]); // false - wait so an empty array is a number?
 8
 9isNaN([1, 2]); // true
10isNaN({}); // true
11isNaN(() => {}); // true

平等 / 真相 vs 虚假

你可能已经熟悉了=====之间的差异。==只检查值,而===包括类型检查。这就是为什么1 ===1是假的,但1 ==1是真的。

还有一种!=意思是不等同。这是真的:‘null!== undefined’,但这是错误的‘null!= undefined’。 接下来? 基本上,第一种说null不等于 undefined,但第二种说null不等于 undefined(双消极,意味着它们不等于 undefined)。

但是让我们看看更多比较,这些比较变得更加复杂,所有这些都是真实的:

1false == '0' // true
20 == false   // true
3'' == 0      // true
4false == ''  // true
5[] == ''     // true, but we'll get to this
6
7'1' == true  // true
81 == true    // true
9'false' == true // true

这些是令人困惑的比较检查,但它们在技术上不是真与假的,它们只是价值检查,因为记住结果是假的,但[]是一个真值。

 1if ("") {
 2  console.log(true);
 3} else {
 4  console.log(false);
 5}
 6// logs false
 7
 8//But look at this
 9if ([]) {
10  console.log(true);
11}
12// logs true - an empty array is still truthy
13
14if ([] == "") {
15  console.log(true);
16}
17// logs true - but look at the first one - it logged false

在平等和类型方面,JavaScript非常有趣,但我建议使用三重等于===!==来进行比较。

现在,最后一个例子是一个很好的关键区别的图像。 宽松的平等检查,检查价值,不一定是假的/真实的。 if块检查假的/真实的。 见,在JavaScript中,这是真的: [] ==假的. 但正如我们上面所看到的那样,一个 if块检查一个空的数组为真实的。 显然, if(false)不会去任何地方。

自动半色插入

我注意到,如果我忘了添加一个半色彩以结束一个代码行,它不会给我一个错误。在场景背后 自动半色彩插入插入了缺少的半色彩,这很好,但可能会产生一个坏习惯。

1function increment(num) {
2  return
3  ++num
4}
5console.log(increment(3))

现在这不是世界上最好的例子,但它可能会让您感到惊讶,因为它返回未定义

1function increment(num) {
2  return;
3  ++num;
4}
5console.log(increment(3));

全球变量

最后,JavaScript有这种奇怪的行为,即从薄空气中创建全球变量。

记住,我们说‘让我们’是区块化的,而‘var’是功能的?那么,这是什么?

1for(i = 0; i < 10; i++) {
2  // ...
3}
4console.log(i); // 10

注意我们做了什么?没有i变量的定义:i=0是什么结果?一个全球变量被创建了,这是危险的事情,因为现在我们的i变量是全球性的。

这也适用于任何函数: 函数 someFn() { someVar = 0; }. 这里的 someVar' 成为一个全球变量,它类似于说 window.var = 0'。

结论

JavaScript 有一些棘手的东西可以导航,事实是,面试人员会对你进行测验,即使你在现实生活中几乎从未看到过它们。

好消息是,有大量的文档和视频教程可以向您展示这些东西,我建议搜索JavaScript艰难面试问题JavaScript棘手问题等东西,即使您在面试中没有得到它们,至少您知道他们是否会出现未来的问题。

幸运,当你怀疑时,记住这些都是所有开发人员所面临的事情 - 你并不孤单!

Published At
Categories with 技术
Tagged with
comments powered by Disqus