# fed-e-task-01-02 **Repository Path**: shay_cormac/fed-e-task-01-02 ## Basic Information - **Project Name**: fed-e-task-01-02 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-03-27 - **Last Updated**: 2021-03-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Part1-2 作业 ( 请在当前文件直接作答 ) ## 简答题 ### 1. 请说出下列最终执行结果,并解释为什么? ```javascript var a = []; for(var i = 0; i < 10; i++) { a[i] = function() { console.log(i) } } a[6]() ``` 答: 10 i 是在全局作用域里,当循环注册函数完整之后,i 的值已经是 10 ,此时调用 a 中的函数打印 i 的值,则为 10 。   ### 2. 请说出此案列最终执行结果,并解释为什么? ```javascript var tmp = 123; if (true) { console.log(tmp); let tmp; } ``` 答: 报错提示,未初始化 因为 if 语句中有块级作用域,let 声明的变量只在 if 语句的块级作用域起作用,let 声明的 tmp 变量提升却没有初始化,console.log(tmp) 只能找到 if 块级作用域中未初始化的 tmp 。   ### 3. 结合ES6语法,用最简单的方式找出数组中的最小值 ```javascript var arr = [12, 34, 32, 89, 4] ``` 答: Math.min( ...arr )   ### 4. 请详细说明var、let、const三种声明变量的方式之间的具体差别 答: | 名称 | 差别 | | :---: | :----------------------------------------------------------: | | var | 注册在全局作用域下,有变量提升,初始化为undefined,声明前可访问,可以只声明不赋值,可重复定义、赋值 | | let | 注册在块级作用域下,有变量提升,未初始化,声明前访问报错,可以只声明不赋值,未负值时访问为undefined,不可重复定义,可重复赋值 | | const | 注册在块级作用域下,有变量提升,未初始化,声明前访问报错,声明时必须赋值,否侧处于未初始化状态,不可重复定义,不可重复赋值,可修改数组、对象中的元素 |   ### 5. 请说出下列代码最终输出结果,并解释为什么? ```javascript var a = 10; var obj = { a: 20, fn() { setTimeout(() => { console.log(this.a) }) } } obj.fn() ``` 答: 20 先在全局注册了a 和 obj ,obj调用函数fn(),此时调用者为obj , this指向obj ,定时器中使用的箭头函数,this指向跟随父级fn(),取 obj 中的 a   ### 6. 简述Symbol类型的用途 答: 1. 用于创建防止重复的对象属性名(独一无二的属性名) 2. 对象私有成员,用于私有成员的属性名 3. 自定义对象标签,例如使用`[Symbol.toStringTag]: 'XObject'` 4. 使用内置 Symbol 常量实现对象迭代器 ### 7. 说说什么是浅拷贝,什么是深拷贝? 答:浅拷贝,拷贝目标对象的指针指向性,也就是拷贝找到目标对象所在内存空间的路径,并没有开辟新的内存空间,而是复制与被复制的对象共用同一个内存空间的数据,一旦其中有一个对象修改了内存中的数据,其他对象获取的数据也会改变 深拷贝,拷贝的是目标对象的内存空间,会新开辟一个内存空间,并将目标对象的所有的内容复制一份存入新的内存空间,两个对象之间相互独立,其中一个数据变化时,不影响另一个   ### 8. 请简述TypeScript与JavaScript之间的关系? 答:TypeScript 是 JavaScript 的超集,是在 JavaScript 基础上扩展一些特性,包括更强的类型系统、es新特性的支持,主要解决 JavaScript 类型系统的不足,使用 TypeScript 可以提高代码的可靠程度,最终会编译成 JavaScript   ### 9. 请谈谈你所认为的typescript优缺点 答: 优点: 1. TypeScript 编译成 JavaScript 的兼容性好 2. JavaScript 运行环境都支持 3. “渐进式”,方便学习使用 4. 更强的类型系统、es新特性的支持 5. 功能更强大,生态更健全、更完善 缺点: 1. 语言本身多了很多概念 2. 小型项目、项目初期可能会增加开发成本 ### 10. 描述引用计数的工作原理和优缺点 答:  核心思想:设置引用计数器,记录当前引用数,判断当前引用是否为0,决定是否为垃圾对象 当引用关系发生改变时修改引用计数器的数字,引用计数器数字为0时回收对象。 优点: 1. 发现垃圾时立即回收 2. 最大限度的减少程序暂停 缺点: 1. 无法回收循环引用的对象,对象之间的相互引用,保持引用数始终不为0,无法回收 2. 时间开销大,因为需要实时监控引用数的变化,对数值进行修改,当监控对象较多时,流程时间增长 ### 11. 描述标记整理算法的工作流程 答: 分标记和清除两个阶段完成 1. 遍历所有对象找标记活动对象 2. 清除阶段先执行整理,移动对象位置 3. 遍历所有对象清除没有标记的对象   ### 12.描述V8中新生代存储区垃圾回收的流程 答: 回收过程采用复制算法 + 标记整理 1. 将新生代区分为两个等大的空间,使用空间(From) 和 空闲空间(To) 2. 活动对象存储于 From 空间 3. 标记整理后将活动对象拷贝至 To 4. 若 To 空间使用率超过25%,或一轮GC还存活的新生代对象,晋升移动至老生代 5. 将 From 进行释放,并与 To空间进行交换   ### 13. 描述增量标记算法在何时使用及工作原理 答:在老年代对象回收时,需要提升回收效率的情况下使用增量标记算法  ​ 将整段的垃圾回收操作拆成多个阶段,与程序执行交替完成  1. 在程序执行间隙,遍历对象进行标记 2. 一层层标记可达对象,与程序执行交替完成 3. 在所以标记完成后,进行清除操作 4. 清除操作完成后,在继续执行代码