10 个 JavaScript 面试题
注意:每个问题后面都附有输出结果和简要解释。请自行承担滚动浏览的风险。
Q1.
var msg = "hello";
if (true) {
var msg = "welcome";
}
console.log(msg);
// ----
let msg2 = "hello";
if (true) {
let msg2 = "welcome";
}
console.log(msg2);
输出
welcome
hello
解释
var由于 `this` 是函数作用域的,因此,当msg它在代码块内声明时if,它会覆盖全局作用域中的 `this` 。而 `this` 是代码块作用域的,所以msg不会发生这种情况。let
Q2.
for (var i = 0; i < 5; i++) {
setTimeout(function () {
console.log(i);
}, 1000);
}
输出
5
5
5
5
5
解释
由于var该变量的作用域是函数式的,因此循环结束后i变量的值保持不变。回调函数每次都会获取到相同的值。5setTimeout
解决方案
- 转换
var为let为每次迭代创建一个作用域。
for (let i = 0; i < 5; i++) {
setTimeout(function () {
console.log(i);
}, 1000);
}
- 将值封装
setTimeout在一个匿名函数中。将其i作为参数传递会将其作用域限定在匿名函数内,因此值不会丢失。
for (var i = 0; i < 5; i++) {
(function (x) {
setTimeout(function () {
console.log(x);
}, 1000);
})(i);
}
Q3.
const obj = {
["foo_" + (() => 1)()]: "Hello",
};
console.log(obj);
输出
{ foo_1: 'Hello' }
第四季度。
console.log([1,2,3] + [4,5,6]);
输出
1,2,34,5,6
解释
String([1,2,3]);是"1,2,3"
因此,"1,2,3" + "4,5,6"是"1,2,34,5,6"
Q5. 执行顺序是什么?
console.log('1');
setTimeout(() => console.log('2'), 0);
Promise.resolve().then(() => console.log('3'));
console.log('4');
输出
1
4
3
2
解释
事件循环的优先级顺序为:调用栈 > 微任务 > 宏任务
所有同步代码首先执行。
因此,日志1,4
接下来,有一个Promise和setTimeout
Promise 回调函数存储在 [此处] microtask queue,setTimeout 回调函数存储在 [此处]。macrotask queue
microtask优先级更高macrotask。因此,它会记录3后续内容。2
Q6.
console.log(typeof typeof 1);
输出
string
解释
从右到左进行评估
typeof 1返回号码typeof 'number'返回字符串
Q7.
console.log(Math.max() < Math.min());
解决方案
true
解释
默认值为 Math.max() & 默认 -Infinity 值为 Math.min()Infinity
因此, -Infinity < Infinity是true
Q8.
function func() {
return foo;
foo = 1;
function foo() {}
var foo = "hello";
}
console.log(typeof func());
输出
function
解释
由于经过一轮解析(提升),代码看起来像这样
function func() {
var foo; // hoisted
function foo() {} // hoisted
return foo;
foo = 1;
foo = "hello";
}
console.log(typeof func());
因此,foo 的最后一个可用值为function
Q9.
console.log(3 > 2 > 1);
输出
false
解释
它从左到右开始,
所以3 > 2等于true
true > 1等价于,1 > 1即false
Q10.
function fn() {
return this.str;
}
var str = "global";
var obj = {
str: "obj",
};
console.log(fn(), fn.call(obj));
输出
global obj
解释
执行时,fn()值为thisiswindow和window.stris global。
.call()分配this给obj并且obj.str是obj
注意:此解决方案在模式下有效non-strict。
感谢阅读💙
关注@codedrops.tech获取每日更新
。Instagram ● Twitter ● Facebook
微学习 ● Web 开发 ● Javascript ● MERN 技术栈 ● Javascript
codesdrops.tech