【前端--面试】常见面试题(三)—— JavaScript

345 阅读3分钟

这是我参与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 2   0 1 2
  • B: 0 1 2  3 3 3
  • C: 3 3 3   0 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: true false true
  • B: false false true
  • C: true false false
  • D: false true true 答案: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无法直接在对应的对象上找到它,但它会沿着原型链向下寻找并在那里找到它,这时候我们就可以访问它。