现在,每个人都有自己的JavaScript Gotchas列表,但像JavaScript是案例敏感
这样的东西不是一个真正的 gotcha。
一个真正的gotcha
对我来说是当1 == 1
和1 == 1
是真的,但[] == []
不是真的。
在本指南中,我们将探讨一些你可能在JavaScript采访中发现的常见问题,面试者可能不会直接问这些问题,但他们可能会问你一些与他们相关的问题或涉及到他们的问题。
放下 vs. 放下
这是最基本的Gotchas之一 - 起初,关键字var
和let
(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
是什么,你需要将i
从for
循环中提起。
附加 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棘手问题
等东西,即使您在面试中没有得到它们,至少您知道他们是否会出现未来的问题。
幸运,当你怀疑时,记住这些都是所有开发人员所面临的事情 - 你并不孤单!