简单题
一、请说出下列最终的执行结果,并解释为什么
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%
十三、描述增量标记算法在何时使用及工作原理
增量标记算法在老年代存储区使用,它先把所有对象标记为“白色”,然后从根节点出发,一层一层的将访问到的对象标记为“灰色”,如果这个对象遍历完了,就标记为“黑色”。等到根对象也变成了“黑色”,说明已经遍历完了所有对象。这时候,剩下的白色对象就是不可访问到的,作为垃圾释放掉。