这是我参与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。
总结--变量的赋值分为三个阶段:
- 创建变量,在内存开辟空间;
- 初始化变量,将变量初始化为
undefined; - 赋值
let、var和function:
-
let的「创建」过程被提升了,但是初始化没有提升。 -
var的「创建」和「初始化」都被提升了。 -
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),这时候num是undefined,乘以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
后缀一元运算符++:
- 返回值(返回
0) - 增加值(num现在是
1)
前缀一元运算符++:
- 增加值(num现在是
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";