# fed-e-task-01-02 **Repository Path**: Minar/fed-e-task-01-02 ## Basic Information - **Project Name**: fed-e-task-01-02 - **Description**: No description available - **Primary Language**: JavaScript - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-07-30 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 简答题 ### 一、请说出下列最终的执行结果,并解释为什么 ```javascript var a = [] for (var i = 0; i < 10; i++) { a[i] = function () { console.log(i) } } a[6]() ``` 这里应该输出10,因为```var i```是全局作用域,在执行a[6]()时,取的i值是全局的i,这个时候i已经为10了,故输出10。 ### 二、请说出下列最终的执行结果,并解释为什么 ```javascript var tmp = 123; if (true) { console.log(tmp) let tmp } ``` 这里会报错,因为```let tmp```会在一个代码块里创建一个局部变量,并且这个局部变量在声明之前是不允许使用的。 ### 三、结合ES6新语法,用最简单的方式找出数组中的最小值 ```javascript const arr [1,2,3,4,5] console.log(Math.min(...arr)) ``` ### 四、请详细说明var,let,const三中声明变量的方式之间的具体差别 var的作用域是全局或者当前函数内,并且它会变量提升,也就是在赋值之前就可以被使用。 let的作用域是全局或者一个代码块(也就是一个大括号),并且不能变量提升,赋值之前使用会报错。 const是let的静态修饰,使得变量不能被重新赋值。 ### 五、请说出下列最终的执行结果,并解释为什么 ```javascript var a = 10; var obj = { a: 20, fn() { setTimeout(() => { console.log(this.a) }) } } obj.fn() ``` 这里会输出20,因为fn()不是一个箭头函数,那它的this就会指向调用者。obj.fn中,调用者是obj,所以会输出obj.a,也就是20。 在浏览器环境下,如果这里让一个变量const b = obj.fn,调用b(),就会输出10,因为b()等价于window.b(),此时调用者是window,会输出window.a,也就是全局变量a=10。 ### 六、简述`Symbol`类型的用途 Symbol类型是一个不能被重复创建类型,所以如果在对象中使用Symbol作为key,外部就不能再创建同样的Symbol去访问它,从而可以用于模拟对象中的私有属性。 ### 七、说说什么是浅拷贝,什么是深拷贝 浅拷贝复制的是对象的引用,深拷贝是复制对象本身。 举个例子,一个数组`const arr = [obj1, obj2]`,此时我让`const arr2 = arr`,这样就创建了每个元素的浅拷贝。当我执行`arr[0].a = 1`时,`arr2[0].a`也会等于1,因为`arr[0]`与`arr2[0]`都指向obj1。 而如果我让`const arr3 = JSON.parse(JSON.stringify(arr))`,此时arr3就是对arr完全的复制,里面的每个元素也都是按照arr里每个元素的样子复制出来的新元素,这时arr[0]的修改就不会影响arr3[0]了。 ### 八、请简述TypeScript与Javascript之间的关系 TypeScript是JavaScript的超集,除了保留了JS本身的语言特性,还加入了类型系统和编译器,使得TS在编写代码的时候可以保证类型安全,并且兼容性更好。 ### 九、请谈谈你所认为的TypeScript优缺点 TypeScript的优点: + 引入类型系统,类型更丰富、更安全 + 添加编译器,可以免去babel TypeScript的缺点: + 由于运行时的欠缺,目前TypeScript依然需要转换成JS运行,类型带来的性能优化就与之无缘了 + 很多类型定义非常麻烦 + 类型还是比较粗糙,比如int、double、float、long这些都属于number,但是其实更细化会更好 不过,随着生态发展,以后TypeScript的运行时必将大行其道。并且目前已经有了AssemblyScript,把TypeScript转换成WebAssembly,经过实战发现性能提升巨大无比,未来还有多线程的支持,前途无限啊。 ### 十、描述引用计数的工作原理和优缺点 #### 引用计数的工作原理 引用计数会有一个引用计数器,定义、引用一个变量、属性、函数时计数就会加1,反之就减1。当计数器次数为0,那就执行GC去回收该变量。 #### 引用计数的优缺点 优点: + GC即时 缺点: + 维护引用计数器需要资源 + 循环引用问题 ### 十一、描述标记整理算法的工作流程 标记整理算法不直接清理标记为垃圾的对象,而是把活跃对象统一移动到某个区域,然后批量清除区域外的对象。 ### 十二、描述V8中新生代存储区垃圾回收的流程 新生代存储区会将存储区分为From和To区,把From区活跃的对象复制到To区,然后清理From,再把To复制回From。 ### 十三、描述增量标记算法在何时使用及工作原理 网上有一篇文章讲的很有意思,增量标记算法的原理就是**垃圾永远是垃圾**。 增量标记算法在老年代存储区使用,它先把所有对象标记为“白色”,然后从根节点出发,一层一层的将访问到的对象标记为“灰色”,如果这个对象遍历完了,就标记为“黑色”。等到根对象也变成了“黑色”,说明已经遍历完了所有对象。这时候,剩下的白色对象就是不可访问到的,作为垃圾释放掉。