简单题
一、请说出下列最终的执行结果,并解释为什么

var  a = []
 for (var i=0;i<10;i++) {
     a[i] = function () {
         console.log(i)
     }
 }
 a[6]()


执行结果为:10   for 循环最后传入的是10

二、请说出下列最终的执行结果,并解释为什么

var tmp = 123;
 if(true) {
     console.log(tmp)
     let tmp
 }


执行结果:报错 在if 中,let是块级作用域,应该先声明再使用,否则报错

三、结合ES6新语法,用最简单的方式找出数组中的最小值

var arr=[12,34,32,89,4]
 let fn = (arg) => Math.min(...arg)
 let min = fn(arr)
 console.log(min)  // 4

四、请详细说明var,let,const三种声明变量的方式之间的具体差别

语法    var a = 10    let a = 10    const a = 10
提升    声明提升,使用undefined初始化    声明 未初始化    声明 未初始化
作用域    全局或函数作用域    块级作用域    块级作用域
初始化    可以仅声明不初始化    可以仅声明不初始化    必须在声明时初始化
重复定义    可以    不可以    不可以
多次赋值    可以    可以    基本数据类型不可以,引用数据类型仅可改变值
声明前访问    可以    不可以    不可以
五、请说出下列代码最终输出的结果,并解释为什么。

var a=10
 var obj = {
     a:20,
     fn(){
         setTimeout(()=>{
             console.log(this.a)  // this 正确地指向 obj 
         })
     }
 }
 obj.fn()

 答案: 20 。箭头函数不会创建自己的this.  从自己作用域链上继承this(他外面第一个不是箭头函数的this【即fn的this】)

六、简述symbol类型的用途

应用场景1:使用Symbol来作为对象属性名(key)

应用场景2:使用Symbol来替代常量

应用场景3:使用Symbol定义类的私有属性/方法

七、说说什么是浅拷贝,什么是深拷贝?

浅拷贝:就是拷贝对象的引用,而不深层次的拷贝对象的值,多个对象指向堆内存中的同一对象,,任何一个修改都会是使得所有对象的值被修改,因为它们公用一条数据。简单来说就是一个对象B复制另一个对象A,当改变B对象的值是A对象的值也随之改变。

深拷贝:深拷贝不会拷贝引用类型的引用,拷贝的是引用类型的值,形成一个新的引用类型。简单来说就是一个对象B复制另一个对象A,当改变B对象的值是A对象的值不会改变

八、请简述Typescript与javascript之间的关系

typescript 是javascript的超集

九、请谈谈你所认为的TypeScript优缺点

Typescript是强类型的Javascript超集,支持ES6语法,支持面向对象编程的概念,如类、接口、继承、泛型等。Typescript并不直接在浏览器上运行,需要编译器编译成纯Javascript来运行。

优点:

1:快速简单,易于学习。

2:编译时提供错误检查, 在代码运行前就会进行错误提示。

3:支持所有的JS库。

4:支持ES6,提供了ES6所有优点和更高的生产力。

5:使用继承提供可重用性。

6:有助于代码结构。

7:通过定义模块来定义命名空间。

缺点:

1:需要长时间的来编译代码。

2:在使用第三方库时,需要有三方库的定义文件,并不是所有三方库都提供了定义文件,提供的定义文件是否准确也值得商榷。

十、描述引用计数的工作原理和优缺点

引用计数的工作原理:设置对象的引用数,有一个引用计数器来维护这些引用数,引用关系改变时修改引用数。判断当前对象引用数是否为0,引用数为0时立即回收。

引用计数算法优点:

发现垃圾时立即回收

最大限度减少程序暂停

引用计数算法缺点:

无法回收循环引用的对象

时间开销大,资源消耗较大

十一、描述标记整理算法的工作流程

标记整理算法工作流程:

标记整理可以看做是标记清除的增强,也是分标记和清除两个阶段来完成

标记阶段:遍历所有对象找标记活动对象

清除阶段:先执行整理,移动对象的位置,然后遍历所有对象清除没有标记的对象

最后回收相应的空间

标记整理算法优缺点:

减少碎片化空间

不会立即回收垃圾对象

十二、描述V8中新生代存储区垃圾回收的流程

回收过程采用复制算法+标记整理

新生代内存区分为二个等大小空间

使用空间为From,空闲空间为To

活动对象存储于From 空间

标记整理后将活动对象拷贝至To

From与To交换空间完成释放

回收细节说明

拷贝过程中可能出现晋升

晋升就是将新生代对象移动至老生代

一轮GC还存活的新生代需要晋升

To空间的使用率超过25%

十三、描述增量标记算法在何时使用及工作原理

增量标记算法在老年代存储区使用,它先把所有对象标记为“白色”,然后从根节点出发,一层一层的将访问到的对象标记为“灰色”,如果这个对象遍历完了,就标记为“黑色”。等到根对象也变成了“黑色”,说明已经遍历完了所有对象。这时候,剩下的白色对象就是不可访问到的,作为垃圾释放掉。