# fed-e-task-01-02 **Repository Path**: ms_H/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-10-18 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 模块二:ES新特性与TypeScript、JS性能优化 ## 简答题 ## 一、请说出下列最终的执行结果,并解释为什么 ```javascript var a = [] for(var i = 0;i<10;i++){ a[i] = function() { console.log(i) } } a[6]() ``` 答:是10,因为数组a的每一项都是一个方法,方法内打印变量 i ,而 i 是 var 声明的一个全局对象, 所以方法内访问的变量 i 是能被获取到的,等循环执行完毕之后就是10 ## 二、请说出下列最终的执行结果,并解释为什么 ```javascript var tmp = 123; if(true){ console.log(tmp) let tmp } ``` 答:会报一个 before initialization 的错,因为在执行console.log(tmp)的时候 会在当前作用域下去寻找被打印的参数 tmp,如果找不到就会往上一层去找, 但是找到的 当前作用域下 `tmp是用let声明的局部作用域`,而`let不能进行声明的提升`。 ## 三、结合ES6新语法,用最简单的方式找出数组中的最小值 ```javascript var arr = [12,34,32,89,4] ``` 答:console.log(Math.min(...arr)) //4 ## 四、请详细说明var,let,const三种声明变量的方式之间的具体差别 答: - var:声明的是全局变量,并且会有声明提升的特性,被var声明的变量会出于作用域链的最顶端 - const:声明的是只读属性(常量),被const声明的成员不能进行修改(不能改变其内存地址),但是 可以修改常量中的成员属性,例如对象的属性、数组中的值 - let:声明的是局部变量,使用let会产生块级作用域,如果在let声明的变量之前进行访问会报错, >比起var,let不能进行声明的提升 ## 五、请说出下列代码最终输出的结果,并解释为什么 ```javascript var a = 10 var obj = { a:20, fn(){ setTimeout(()=>{ console.log(this.a) }) } } obj.fn() ``` 答:`20。//因为obj调用了方法fn,所以this指向obj` ## 六、简述Symbol类型的用途 答: - 创建一个唯一值 - 可以为对象创造一个独一无二的私有属性 - 可以用来实现iterator接口(迭代器) ## 七、说说什么是浅拷贝,什么是深拷贝? 答:浅拷贝和深拷贝一般针对`Object和数组`这样的引用类型。 - 浅拷贝:只复制了指向某个对象的指针,而不是复制对象本身,新旧对象都指向同一个地址 (堆中的起始地址),共享同一块内存,修改复制的对象同时会修改源对象本身 - 深拷贝:会创建一个一模一样的对象(开辟一块新的内存空间),新旧对象的地址指向不同, 且不共享内存。 ## 八、请简述TypeScript与JavaScript之间的关系。 答:TypeScript是基于JavaScript之上的语言,是JavaScript的超集(扩展语言),在 JavaScript之上多了一套更强大的类型系统,而TypeScript最后都会编译成JavaScript ## 九、请谈谈你所认为的TypeScript优缺点 答: - 优点: - ts是渐进式的,只要有js基础,基本能很快掌握 - 避免开发过程中的类型异常,提升代码的效率和可靠程度 - 相比flow 功能更加强大,生态也更加健全、更加完善 - 开发工具支持友好 - 适用于长周期的大型项目 - 缺点: - 语言多了很多概念 - 需要更多的学习成本 - 项目初期,会增加一些成本 ## 十、描述引用计数的工作原理和优缺点 答: - 工作原理:设置引用数,每引用一次就加1,判断当前引用数是否为0, 当引用对象的计数为0时,就会被回收 - 优点 - 发现垃圾时立即回收 - 最大限度减少程序暂停(减少程序卡顿时间) - 缺点 - 无法回收循环引用的对象 - 时间开销大(需要监听对象上的数字变化) ## 十一、描述标记整理算法的工作流程 - 答: - 1、遍历所有对象寻找活动对象并标记 - 2、遍历所有对象清除没有标记的对象 - 3、到清除阶段先执行整理,移动对象位置,让他们在地址上产生连续 - 4、清除未活动对象,回收相应的空间 ## 十二、描述V8中新生代存储区垃圾回收的流程 - 答:V8中的新生代对象回收过程采用复制算法和标记整理算法。在新生代存储区中又分为使用空间From和空闲空间To, 将活动对象存储于From空间,当标记整理后会将活动对象拷贝至To空间,在拷贝过程中可能会出现晋升,将新生代对象移 动至老生代,当From和To两个空间完成交换之后,完成释放,