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

491 阅读3分钟

这是我参与8月更文挑战的第14天,活动详情查看:8月更文挑战

今天整理面试题的时候,想起来面试时候开始都会做面试题,大部分的题都是实战,不是单纯的背背定义,今天就来看一些题目回顾一下相关的知识点。

变量提升问题

function info() {
   console.log(name);
   console.log(age);
   var name = '葳蕤';
   let age = 24;
}
  • A: 葳蕤 undefined
  • B:葳蕤 ReferenceError
  • C:ReferenceError 24
  • D:undefined ReferenceError

答案:D

是不是定义记得熟熟的,遇到代码了,就突然不会分析了呢,下面一起来分析一下这段代码:

info这个函数中,我们使用var 声明了name这个变量,JavaScript在创建变量阶段给name分配了内存空间,默认值是undefined,所以我们打印name的时候,值还是undefined。

在使用let声明变量的时候,也会存在变量提升,但是和var是不同的,let在没有初始化或者赋值前是不允许访问的,这种被称为“暂时性死区”,这时候,JavaScript会抛出一个ReferenceError

总结--变量的赋值分为三个阶段:

  1. 创建变量,在内存开辟空间;
  2. 初始化变量,将变量初始化为undefined
  3. 赋值

letvarfunction

  1. let 的「创建」过程被提升了,但是初始化没有提升。

  2. var 的「创建」和「初始化」都被提升了。

  3. function 的「创建」「初始化」和「赋值」都被提升了。

箭头函数和普通函数

const numValue = {
  num: 10;
  numTwo() {
    return this.num * 2
  },
  numThree:() => this.num * 3
};

numValue.numTwo();
numValue.numThree();
  • A: 20 30
  • B:20 NaN
  • C:NaN 30

答案:B

在这里,箭头函数中的this是指向所在的上下文,所以在调用numThree时候,不是指向numValue对象,是指向它定义的环境(window),这时候numundefined,乘以3后就是NaN了;普通函数还是遵循谁调用指向谁。

运算符

+true;
!"WEIRUI";
  • A: 1 false
  • B:false NaN
  • C:false false

答案:A

一元加号运算符会把boolean类型转换为数字类型,true会转换为1,false会转换为0;字符串"WEIRUI"是一个真值,代码其实表达的是这个真值是假的吗,所以就返回false.

运算符2

let num = 0;
console.log(num++);
console.log(++num);
console.log(num);
  • A: 1``1``2
  • B: 1``2``2
  • C: 0``2``2
  • D: 0``1``2

答案:C

后缀一元运算符++

  1. 返回值(返回0
  2. 增加值(num现在是1

前缀一元运算符++

  1. 增加值(num现在是2
  2. 返回值(返回2

所以返回0 2 2

类型转换

function num(a, b) {
  return a + b;
}

num(1, "2");
  • A: NaN
  • B: TypeError
  • C: "12"
  • D: 3

答案: C

我们都知道JavaScript 是一种动态类型语言,在我们没有指定变量类型的时候,值会自动转换为另一种类型,这就是隐式类型转换

在这个例子中,JavaScript把数字1转换为字符串,使num函数有意义并且返回值,在数字类型和字符串类型相加时候,数字就被隐式转换为字符串,就返回了"12"