# fed-e-task-01-02 **Repository Path**: rpyoyo/fed-e-task-01-02 ## Basic Information - **Project Name**: fed-e-task-01-02 - **Description**: No description available - **Primary Language**: JavaScript - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-08-30 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 简答题 ### 一、说出下面执行结果,并解释为什么 ```js var a = [] for (var i = 0; i < 10; i++) { a[i] = function() { console.log(i) } } a[6]() ``` 执行结果为10,a数组中的函数在调用时,才会访问变量i,此时循环已经完成,i的值为10 ### 二、请说出下面执行的最终结果,并解释为什么 ```json var tmp = 123; if (true) { console.log(tmp) let tmp } ``` 执行结果为抛出异常,变量tmp无法在声明前被访问,if中存在let tmp声明tmp变量,使if内部形成块级作用域,let声明的变量不会出现变量提升,无法在声明前被访问,因此抛出异常 ### 三、结合ES6新语法,用最简单的方式找出数组中的最小值 ```js var arr = [12, 34, 32, 89, 4] const min = arr.reduce((a, b) => a < b ? a : b) ``` ### 四、请详细说明var,let,const三种声明变量方式之间的具体差别 + var声明会提升到作用域头部,可以先使用后声明变量 + let声明方式是ES6中新增加的方式,会形成块级作用域,变量必须先声明,后使用 + const声明的变量为常量,声明后不允许重新赋值,但可以改变引用类型的属性值,与let方式类似,会形成块级作用域,必须先声明后使用 ### 五、请说出下列代码最终输出的结果,并解释为什么 ```js var a = 10; var obj = { a: 20, fn () { setTimeout(() => { console.log(this.a) }) } } obj.fn() ``` 执行结果为20,setTimeout传入的函数是箭头函数,箭头函数中的this始终指向函数定义时所在的对象,不会随调用改变,这里指向对象obj,因此this.a访问的是obj.a属性,即值为20 ### 六、简述Symbol类型用途 Symbol类型是ES6中新增的类型,用于创建一个唯一的值,可以用来作为对象的key,避免key值冲突,或者用来定义私有成员 ### 七、说说什么是浅拷贝,什么是深拷贝 + 浅拷贝只拷贝对象的栈内存中存放的内容,即基本数据类型存放在栈内存中的值以及引用类型存放在栈内存中指向堆内存的引用地址,浅拷贝的对象如果是引用类型,则拷贝后的对象与拷贝前的对象指向同一个堆内存地址,修改一个对象的内容,另一个对象也会被修改 + 深拷贝之于浅拷贝,在拷贝栈内存中的内容的同时,也会拷贝引用类型在堆内存中的值,拷贝前后的对象,修改不会相互影响 ### 八、请简述TypeScript与JavaScript之间的关系 TypeScript是JavaScript的超集,在JavaScript的基础上,扩展了类型系统,ES6+新特性,以及一些额外的功能增强,例如interface、enum、泛型等 ### 九、请谈谈你所认为的TypeScript的优缺点 + 优点 + 提供了类型系统,使代码在开发阶段就能暴露出隐式类型转换所产生的代码错误,使代码更健壮,适合多人协作的大型项目 + 能够使IDE提供更好的函数调用提示,非常适合编写工具库或框架等 + 缺点 + 需要编写大量的类型声明,对于小型单人维护的项目,会增加开发成本 ### 十、描述引用计数的工作原理和优缺点 引用计数的工作原理是当对象的引用发生变化时,通过引用计数器对对象的引用数量进行计数,当引用数量为0时,立即进行回收 + 优点 + 引用为0时立即回收 + 减少程序暂停 + 缺点 + 无法回收循环引用的对象 + 存在资源开销 ### 十一、描述标记整理算法的工作流程 标记整理算法分为标记和整理两个阶段 + 标记阶段,遍历所有对象,标记所有活动对象 + 整理阶段,对所有活动对象进行整理,移动位置使内存连续,回收所有非活动对象,并清除标记 ### 十二、描述V8中新生代存储区垃圾回收的流程 V8新生代存储区采用标记整理和空间复制算法进行垃圾回收,新生代存储区被分为From和To两个大小相等的区,From区为使用区,To区为空闲区,所有对象都存放在From区中,当触发垃圾回收时,先使用标记整理算法对From区中的对象进行标记,并使用空间复制算法,将活动的对象拷贝到To区中,回收From区中的所有对象,并交换From与To区 对象拷贝过程中会发生晋升操作,将新生代区中的对象移入老生代区中,晋升对象的规则为: + 一轮GC后依然活动的对象 + To空间使用率超过25%时 ### 十三、描述增量标记算法在何时使用及工作原理 增量标记算法在老生代存储区垃圾回收时使用,用来对回收效率进行优化,垃圾回收会阻塞程序执行,当需要回收的垃圾较多时,容易造成长时间阻塞,使用增量标记算法,将垃圾回收的过程进行分段,与程序交替执行,从而提高垃圾回收的效率,避免长时间阻塞程序