1、请说出下列最终的执行结果,并解释为什么?
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6]();
最终执行结果为: 9
原因是因为:
var
提升变量,将变量a
提升为全局变量,for
循环进行时,将a[6]
赋值为function() { console.log(i) }
匿名函数,当a[6]()
执行的时候,打印全局变量i
,此时i
为9。
2、请说出下列最终的执行结果,并解释为什么?
var tmp = 123;
if(true) {
console.log(tmp);
let temp;
}
最终执行结果为: 123
原因是因为:
首先查看log
输出的位置是在if
判断的内部作用域调用,虽然在log
下面有let tmp
声明,但是此时log方法
里的tmp
并不知道,于是就从上一层作用域即此时的全局作用域寻找tmp
声明的地方,此时的全局var tmp = 123
起作用
3、结合ES6新语法,用最简单的方式找出数组中的最小值?
var arr = [12, 34, 32, 89, 4];
详细代码位于code文件夹下for-of.js
文件中
4、请详细说明var,let,const三种声明变量的方式之间的具体差别?
- var声明的变量作用域为方法体内,如果碰到类似于
if、for
语句中的大括号情况,是不会将此大括号中的范围当作当前变量的作用域,而是会变量提升。声明赋值后可以对变量的值进行更改。 - let声明的变量,将当前大括号内的范围当作是该变量的作用域。声明赋值后可以对变量的值进行更改。
- const声明的变量作为一个常量存在,将当前大括号内的范围当作是该变量的作用域。声明赋值后不可以再对其值进行更改。
5、请说出下列代码最终输出的结果,并解释为什么?
var a = 10;
var obj = {
a: 20,
fn () {
setTimeout(() => {
console.log(this.a)
})
}
}
obj.fn()
最终执行结果为: 10
原因是因为:
this的指向要看它所在方法的调用者,这里this
所在的fn
函数被obj
所调用,而obj
所在的上下文内容里声明的是var a = 10
,所以打印出来的结果应该为10
6、简述Symbol类型的用途?
- 用于对象的key声明
- 用于类的私有属性声明
- 创建独一无二的标识
7、说说什么是浅拷贝,什么是深拷贝?
- 浅拷贝是将源对象的属性和值拷贝到目标对象中。源对象中值是原始类型数据的属性复制到目标对象中,源对象中值是对象类型的数据将该属性值的内存地址赋值给目标对象的属性
- 深拷贝是将源对象的属性和值拷贝到目标对象中。源对象中值是原始类型数据的属性复制到目标对象中,源对象中值是对象类型的数据将该属性值的后代属性的原始类型值复制给目标对象的属性
8、谈谈你是如何理解JS异步编程的,Event Loop是做什么的,什么是宏任务,什么是微任务?
- JS异步编程即耗时操作,区别于同步模式,异步模式为多js模拟的多线程操作,当异步操作执行完成后调用回调函数来触发异步耗时操作结束后的动作。
- Event Loop称为消息队列,它负责监听调用栈和消息队列,当调用栈里面的任务都执行完成后,就从消息队列里面读取任务,可以理解为待办的工作表
- 宏任务:对于宏任务来说,加入的新的方法调用,需要作为一个新的宏任务进入队列中排队。大部分异步调用作为宏任务执行。
- 微任务:直接在当前任务结束后立即执行,会在本轮任务执行完成后直接执行。包括Promise对象、MutitonObserver对象和node中的process.nextTick方法会作为微任务方法直接在本来任务执行的末尾执行。
9、将下面异步代码使用Promise改进
setTimeout(function () {
var a = "hello";
setTimeout(function() {
var b = "lagou";
setTimeout(function() {
var c = "I ♥ U";
console.log(a + b + c);
}, 10);
}, 10);
}, 10);
详细代码位于code文件夹下setTimeout.js
文件中
10、请简述TypeScript与javaScript之间的关系?
- TypeScript是对javaScript语言的增强,增加了强类型等特性,并且能够在编码阶段即发现代码中存在的代码使用错误。
- 同时兼容了对javaScript的所有语法。
11、请谈谈你所认为的TypeScript优缺点?
- TypeScript的优点:提供强类型声明和校验,编码过程既能检查错误写法,适合大型项目开发。
- TypeScript的缺点:
- 变量的声明或者形参的使用,都要做类型的声明,增加了编码量。
- 为了兼容javaScript的语法,存在一些隐式处理。
- 较于javaScript引入了许多新的语言特性,有较高的学习成本。