# fed-e-task-01-02 **Repository Path**: learning-summary/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**: 2020-12-01 - **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 > > 分析: i 是在全局作用域声明,for 循环已经循环完了之后,全局作用域中i已经被重新赋值了,因此a[i]中的console.log(i)打印的是全局作用域i的值 #### 二、请说出下列最终的执行结果,并解释为什么。 ```js var tmp = 123 if(true) { console.log(tmp) let tmp } ``` > 输出结果: 会报错 > > 分析:因为在{}中,let 关键字为{}增加了块级作用域,而let关键字不存在变量声明提升,tmp 在当前作用域写在let声明之前,因此会报错 #### 三、结合ES6新语法,用最简单的方式找出数组的最小值。 ```js var arr = [12, 34, 32, 89, 4] ``` ```js Math.min(...arr) ``` #### 四、请详细说明var,let,const三种声明变量的方式之间的具体差别。 > var 声明可以变量提升,容易造成内存泄漏,容易污染全局变量 > > let和const会在{}中创建块级作用域,不存在变量提升。 > > let 和const不同点是,let声明的变量可以重新赋值,const不能重新赋值,但是const声明的对象,可以给声明对象的属性赋值 #### 五、请说出下列代码最终输出的结果,并解释为什么。 ```js var a = 10 var obj = { a: 20, fn() { setTimeout(() => { console.log(this.a) }) } } obj.fn() ``` > 输出:20 > > 分析:箭头函数中this指向其所在function所在函数内的this(定义时),而普通function的this指向,一般都是调用时,简单来说就是谁调用function就是指向谁 #### 六、简述Symbol类型的用途。 Symbol表示唯一的标识符。 - 防止变量声明冲突,用symbol类型创建唯一的标识符 - [Symbol.interator] 指向具有interaror的生成器 - [Symbol('name')] 给对象声明唯一的键 #### 七、说说什么是浅拷贝,什么是深拷贝? > **浅拷贝:** 浅拷贝只是对基本类型以及对象的地址进行拷贝,扩展运算符、Object.assign都是浅拷贝 > > **深拷贝:** 深拷贝,是将对象中的每一项都进行了拷贝。 #### 八、请简述TypeScript 与 JavaScript之间的关系。 > Typescript是javascript的超集,让Javascript可以在编译阶段就能检测代码,让代码更加规范。 #### 九、请谈谈你所认为的TypeScript 优缺点。 > Typescript相比Javascript而言,形式和规范发生了很大的变化,Typescrip是对JavaScript的一种约束,因此,Typescirpt的学习成本变高了,其写法更接近Java语言的写法。 #### 十、描述引用计数的工作原理和优缺点。 > **工作原理:** 设置引用数,当引用关系发生变化时,引用计数也会变化,当引用数为0时,就会立马执行回收 > > **优点:** > > - 发现垃圾会立马执行回收 > > - 最大程度的保证程序不被占满,当内存快被占满,达到极限时,就会去找那些引用数为0的垃圾,然后回收那些垃圾从而释放内存。 > > **缺点:** > > - 无法回收循环引用的对象 #### 十一、描述标记整理算法的工作流程。 > 1. 标记阶段:遍历所有对象,给所有活动对象打上标记。 > > 2. 清除整理阶段:遍历所有对象,移动所有没有标记对象的位置,使得空间具有连续性,回收所有垃圾对象,释放内存空间,将打上标记的对象清除标记。 #### 十二、描述V8中新生代存储区垃圾回收的流程。 > 新生代存储区采用的是复制算法和标记整理算法。 > > 1. 新生代存储区会一分为二,一个是from,一个是to,from是使用空间,to是空闲空间 > > 2. 采用标记整理算法,标记活动对象,移动未标记对象位置,整理from空间 > > 3. 采用复制算法,将from中的活动对象复制到to中 > > 4. 回收from空间,释放内存 > > 5. from和to空间交换 #### 十三、描述增量标记算法在何时使用及工作原理。 > 增量标记算法是在老生代存储区执行GC的时候会用到 > > **工作原理:** > > 1. GC会阻断程序的执行 > > 2. 增量标记算法原理就是让GC分段执行,尽量保证GC的执行时间更短,让用户无感知。