这是我参与8月更文挑战的第15天,活动详情查看:8月更文挑战
今天继续整理面试题目的考察,在题中加固一些常见的知识点。(今天差点忙到忘记更新,在洗漱完想起来~~)
事件执行机制问题
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 1);
}
for (let i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 1);
}
- A:
0 1 20 1 2 - B:
0 1 23 3 3 - C:
3 3 30 1 2
答案:C
由于JavaScript中的事件执行机制,setTimeout函数真正被执行时,循环是已经走完的, 因为第一个循环中的变量i是使用var关键字声明的,所以说这个值是全局的。 在循环期间,我们每次使用一元运算符++都会将i的值增加1。 所以在第一个例子中,当调用setTimeout函数时,i已经被赋值为3。
在第二个循环中,使用let关键字声明变量i:使用let(和const)关键字声明的变量是具有块作用域的。 在每次迭代期间,i将被创建为一个新值,并且每个值都会存在于循环内的块级作用域。所以依次打印出i的值。
类型判断问题
let a = 3;
let b = new Number(3);
let c = 3;
console.log(a == b);
console.log(a === b);
console.log(b === c);
- A:
truefalsetrue - B:
falsefalsetrue - C:
truefalsefalse - D:
falsetruetrue答案:C
在JavaScript中,new出来的变量其实是一个内置的构造函数,变量b看起来是一个数字,但它本质上是一个对象。
当我们使用==运算符时候,只检查了他们是否具有相同的值,所以返回的是true;
当我们使用===操作符时,类型和值都必须是相等的,所以这时候是返回false的。
“use strict”问题
let doing;
dotign = {};
console.log(dotign);
- A:
{} - B:
ReferenceError: dotign is not defined - C:
undefined
答案: A
我们自己在控制台打印的时候就能看到打印出来的是undefined,为什么没有报错呢,那是因为没有加上“use strict”,在严格模式下,变量赋值前是必须声明的。
模板字符串问题
function getMyInfo(one, two, three) {
console.log(one);
console.log(two);
console.log(three);
}
const person = "weirui";
const age = 24;
getMyInfo`${person} is ${age} years old`;
- A:
weirui``24``["", "is", "years old"] - B:
["", "is", "years old"]``weirui``24 - C:
weirui``["", "is", "years old"]``24答案: B
如果我们使用了标记的模板字符串,则第一个参数的值始终是字符串值的数组。 其余参数获取传递到模板字符串中的表达式的值!
判断题:所有对象都有原型
- A: 对
- B: 错误 答案: B
除基础对象外,所有对象都有原型。 基础对象可以访问某些方法和属性,例如.toString。 这就是我们可以使用内置JavaScript方法的原因, 所有这些方法都可以在原型上找到,虽然JavaScript无法直接在对应的对象上找到它,但它会沿着原型链向下寻找并在那里找到它,这时候我们就可以访问它。