# fed-e-task-01-02 **Repository Path**: S_L_G/fed-e-task-01-02 ## Basic Information - **Project Name**: fed-e-task-01-02 - **Description**: No description available - **Primary Language**: JavaScript - **License**: BSD-3-Clause - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-07-05 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # fed-e-task-01-02 ### 一、说出下列最终的执行结果,并解释为什么。 ```javascript var a = [] for (var i = 0; i < 10; i++) { a[i] = function() { console.log(i) } } a[6]() ``` ES2015前,js没有块级作用域,使用var声明的变量,实际是声明到了全局变量空间中。当循环结束时,访问函数中的i,其实就是访问全局变量i,此时i 已经等于10。所有最终执行结果是10。 ### 二、说出下列最终的执行结果,并解释为什么。 ```javascript var tmp = 123 if (true) { console.log(tmp) let tmp } ``` 输出引用错误:Cannot access 'tmp' before initialization。因为let关键字会使当前块形成块级作用域,并且let声明的变量不会提升,在未声明时,使用变量会报出引用错误。 ### 三、结合ES6新语法,用最简单的方式找出数组中的最小值 ```javascript var arr = [12, 34, 32, 89, 4] ``` ```javascript let min = arr[0] for (num of arr) { min = min < num ? min : num } ``` ### 四、请详细说明var,let,const三种声明变量的方式之间的具体差别 1. var声明变量存在变量提升,没有块级作用域,全局作用域中var声明的变量会变成全局对象的属性。 2. let声明变量不存在变量提升,有块级作用域,全局作用域中let声明的变量不会变成全局对象的属性。 3. const声明变量不存在变量提升,有块级作用域,全局作用域中const声明的变量不会变成全局对象的属性,一旦声明必须赋值,且声明后不可修改,如果变量是复合类型值,可以修改属性值。 ### 五、说出下列最终的执行结果,并解释为什么。 ```javascript var a = 10 var obj = { a: 20, fn() { setTimeout(() => { console.log(this.a) }) } } obj.fn() ``` 输出20 因为箭头函数内部没有自己的this,所以this会指向最近的外层存在的this,本例中箭头函数中的this指向obj方法fn中的this,即obj。 ### 六、Symbol类型的用途 symbol是es6中一种新的原始数据类型,表示独一无二的值,symbol值不会重复。 1. 作为属性名,可以解决属性名冲突的问题。 2. 消除魔术字符串,如果一个字符串是什么不重要,可以使用symbol替换。 3. ES6内置了11个symbol值,指向语言内部使用的方法,比如[[Symbol.iterator]] 4. 模拟实现私有属性。 ### 七、说说什么是浅拷贝,什么是深拷贝 浅拷贝只复制原始类型的值及对象的引用,修改新拷贝的值,可能会影响的被拷贝的值。 深拷贝复制原始类型的及对象的值,新旧对象不共享对同一块内存的引用。修改新对象不会影响被拷贝的值。 浅拷贝只复制对象的第一层属性,深拷贝会循环递归复制被拷贝对象的属性 ### 八、简述Typescript和JavaScript之间的关系 Typescript是JavaScript的超集,它可以编译成JavaScript。 Typescript提供了最新的JavaScript特性,已经EcmaScript中的提案。比如异步功能和Decorator. Typescript提供了渐进式的类型系统。 ### 九、Typescript的优缺点 1. Typescript提供了类型系统,提供了代码的可读性和可维护性 2. 类型系统使得代码更安全,减少类型错误。编译阶段也能提前发现错误。 3. 大大增强了IDE的代码提示,接口提示,定义跳转,重构等功能。 缺点: 1. 需要学习许多新的概念,比如接口interface, 泛型,高级类型等 2. 增加一些前期开发成本,比如类型文件*.d.ts ### 十、描述引用计数的工作原理和优缺点 引用计数记录着对一个对象的引用次数,每当程序中增加一个对该对象值的引用时,引用计数器加1,对该对象引用减少时,引用计数器减1,直到引用计数器为零。该对象被视为垃圾,并使用gc回收该空间。 优点:实时性高,不需要等到内存不够用时,才回收。 缺点:存在循环引用时,引用次数无法清零,也就无法被回收。造成内存空间浪费,甚至引发内存泄漏。 ### 十一、描述标记整理算法的工作流程 1. 遍历内存中的对象,对可达对象也称活动对象,进行标记。 2. 对标记的对象就行整理,使其内存空间连续 3. 遍历所有对象,清除没有被标记的对象,回收内存空间 ### 十二、描述V8中新生代存储区垃圾回收的流程 Scavenge算法,是一种用空间换时间的算法,首先现将内存分为等大的两块,两块中只有一块处于使用状态,称为Form空间,另一块称为To空间。 1. 检测From中的存活对象,将其拷贝到To空间去。释放非存活对象的空间。 2. 复制完成后,将To和From空间进行对调。 经过一轮以上Scavenge算法,还存活的对象,晋级到老生代存储。 当复制到To空间后,To空间使用率超过25%,To空间中的对象晋级到老生代。 ### 十三、描述增量标记算法在何时使用及工作原理。 垃圾回收过程中,需要暂停js线程,等待垃圾回收完成,js线程恢复执行。这称为’全停顿‘。全停顿会使程序长时间卡顿,影响程序性能。以1.5 GB的垃圾回收堆内存为例,V8做一次小的垃圾回收需要50毫秒以上,做一次非增量式的垃圾回收甚至要1秒以上。为了减少程序长时间卡顿,V8引擎将标记分为多个小段,每执行一小段,恢复程序执行一会,然后再执行一小段。直到标记完成。这称为增量标记。