作业

234 阅读4分钟

简答题

1. 请说出下列最终的执行结果,并解释为什么

var a = []
for(var i = 0; I < 10; i++){
	a[i] = function(){
	console.log(i)
}
}
a[6]();
答案:打印出10,因为var申明的是全局变量,当要执行a6时for循环已经执行完毕因此打印出来的都是10

改写:

for(let i = 0; i < 10; i++){
	a[i] = function () {
		console.log(i)
	}
}

2.请说出下列最终的执行结果,并解释为什么?

var tmp = 123;
if(true){
	console.log(tmp);
let tmp;
}
会报ReferenceError 因为if是一个块级作用域因此他会直接去执行console.log(tmp); 由于tmp是用let申明的,他没有变量提升,所以会报错

3.结合ES6新语法,用最简单的方式找出数组中的最小值

console.log(Math.min(…arr))

4.请详细说明var,let,const三种申明变量的方式之间的具体差别

var申明全局变量,有变量提升, 没有块级作用域
let 和 const 无变量提升有块级作用域
let申明变量
const申明常量,当他申明引用类型时指向该对象的指针,所以可以改变对象中的属性

5.请说出下列代码最终输出的结果,并解释为什么?

var a = 10;
var obj = {
	a: 20,
	fn  () {
		setTimeout(() => {
			console.log(this.a)
        })
    }
}
Obj.fn()
打印出 20, 如果setTimeout使用普通函数function(){}会打印出10 因为他的this指向是window 但是这里用了箭头函数,箭头函数的this是执行上下文的this,这里是指obj,所以会打印出20

6. 简述Symbol类型的用途

为对象创建私有成员

7.说说什么是浅拷贝,什么是深拷贝

浅拷贝:是拷贝一个对象里面的数据,但是不拷贝这个对象里面的子对象。深拷贝:会克隆出一个对象,数据相同,但是引用地址不同(就是拷贝这个对象里面的数据,而且拷贝它里面的子对象)。

8. 谈谈你是如何理解JS异步编程的,Event Loop是做什么的,什么是宏任务,什么是微任务

我理解的异步编程:异步是相对于同步而言的,同步就是一件事一件事的执行。只有前一个任务执行完毕,才能执行后一个任务。而异步就是当JS引擎顺序执行到异步方法的时候发现他是个异步任务,则会把这个任务挂起,继续执行后面的代码,直到返回回调函数才会执行。
Event Loop 指的是计算机系统的一种运行机制,也就是我们说的事件循环
宏任务:
    1.宏任务所处的队列就是红任务队列 
    2.第一个宏任务队列中只有一个任务:执行主线程的js代码
    3.宏任务队列可以有多个
宏任务分类:setTimeout setInterval requrestAnimationFrame

微任务:
    1.微任务所处的队列就是微任务队列
    2.只有一个微任务队列
    3.在上一个宏任务队列执行完毕后如果有微任务队列就会执行微任务队列中的所有任务
微任务分类:new Promise().then(回调),MutationObserver, process.nextTick

9. 将下面异步代码使用Promise改进

setTimeout(function(){
var a = "hello";
setTimeout(function(){
	var b = "lagou";
	setTimeout(function(){
		var c = "1 ♡ u";
		console.log(a+b+c)
	},10)
},10)

改写:

func = (string) => {
	return new Promise(function(resolve, reject){
		setTimeout(function(){
			resolve(string)
		}, 10);
	})
}

func('hello').then(res => {
	const a = res;
	console.log(a);
	func('lagou').then(res => {
		const b = res;
		console.log(b);
		func('1 ♡ u').then(res => {
			console.log(res);
			console.log(a + b + res)
		})
	})
})

10.请简述TypeScript 与JavaScript之间的关系?

avaScript 和 TypeScript 的关系
TypeScript是 JavaScript 的超集,包含了 JavaScript 的所有元素,可以载入 JavaScript 代码运行,并扩展了 JavaScript 的语法。
TypeScript 可以使用 JavaScript 中的所有代码和编码概念,TypeScript 是为了使 JavaScript 的开发变得更加容易而创建的。
JavaScript 和 TypeScript 的主要差异
TypeScript 从核心语言方面和类概念的模塑方面对 JavaScript 对象模型进行扩展。
JavaScript 代码可以在无需任何修改的情况下与 TypeScript 一同工作,同时可以使用编译器将 TypeScript 代码转换为 JavaScript。
TypeScript 通过类型注解提供编译时的静态类型检查。
TypeScript 中的数据要求带有明确的类型,JavaScript不要求。
TypeScript 为函数提供了缺省参数值。
TypeScript 引入了 JavaScript 中没有的“类”概念。
TypeScript 中引入了模块的概念,可以把声明、数据、函数和类封装在模块中。

11.请谈谈你所认为的TypeScript优缺点?

优点:
1,TypeScript 增加了代码的可读性和可维护性
2,TypeScript 非常包容
3,TypeScript 拥有活跃的社区

缺点:
1.有一定的学习成本,需要理解接口(Interfaces)、泛型(Generics)、类(Classes)、枚举类型(Enums)等前端工程师可能不是很熟悉的概念
2.短期可能会增加一些开发成本,毕竟要多写一些类型的定义,不过对于一个需要长期维护的项目,TypeScript 能够减少其维护成本
3.集成到构建流程需要一些工作量
4.可能和一些库结合的不是很完美