简答题
一、请说出下列最终的执行结果,并解释为什么。
var a = [];
for(var i = 0; i<10; i++){
a[i] = function(){
console.log(i)
}
}
a[6]()
解答:
10 i为全局变量经过for循环以后i变成了10打印的结果为全局的i所以是10
二、请说出下列最终的执行结果,并解释为什么。
var tmp = 123;
if(true){
console.log(tmp)
let tmp
}
解答:
报错 在块级作用域中用let声明的变量,无法变量提升应先定义后使用
三、结合ES6新语法,用最简单的方式找出数组中的最小值。
var arr = [12, 34, 32, 89, 4]
解答:
console.log(Math.min(...arr))
四、请详细说明 var, let, const 三种声明变量的方式之间的具体差别。
解答:
五、请说出下列代码最终输出的结果,并解释为什么。
var a = 10;
var obj = {
a: 20,
fn () {
setTimeout(() => {
console.log(this,this.a)
})
}
}
obj.fn()
解答:
20 箭头函数不会改变this的指向所以this的指向还是obj
六、简述 Sybol类型的用途述。
解答:
- 解决扩展对象,属性名冲突问题
- Symbol 模拟实现私有成员
七、说说什么是浅拷贝,什么是深拷贝。
解答:
- 浅拷贝:拷贝的是内存地址,相当于赋值当b改变时a也会改变
- 深拷贝:拷贝对象的具体内容,内存地址是自主分配的,拷贝结束之后俩个对象页互相不影响,互不干涉
八、请简述 TypeScript 与 JavaScript 之间的关系。
解答:
TypeScript是 JavaScript 的超集,包含了 JavaScript 的所有元素,
在TypeScript中可以运行JavaScript代码。
九、请谈谈你所认为的 TypeScript 优缺点。
解答:
优点
- 增强代码的可读性和可维护性,强类型的系统
- 自动转换新特性,可以立即使用新特性
- 任何一种 JavaScript 运行环境都支持
- 生态更加健全、更完善
缺点:
- 语言本身多了很多概念,增加学习成本
- 项目初期, TypeScript 会增加一些成本
十、描述引用计数的工作原理和优缺点。
解答:
引用计数
- 核心思想:设置引用数,判断当前引用数是否为 0
- 引用计数器
- 引用关系发生改变时修改引用数字
- 引用数字为 0 时立即回收
引用计数优点
- 发现垃圾时立即回收
- 最大限度减少程序暂停
引用计数缺点
- 无法回收循环引用的对象
- 时间开销大
十一、描述标记整理算法的工作流程。
解答:
- 遍历所有对象,将当前活动可达对象标记
- 将当前活动对象移动,变成连续的位置
- 清除没有标记对象
- 回收相应的空间
十二、描述 V8 中新生代存储区垃圾回收的流程。
解答:
- 回收过程采用复制算法 + 标记整理
- 新生代内存区分为二个等大小空间
- 使用空间为 From,空闲空间为 To
- 活动对象存储于 From 空间
- 标记整理后将活动对象拷贝至 To
- From 与 To 交换空间完成释放
- 如果拷贝的过程中一轮GC还存活的就需将新生代对象移动至老生代
- To 空间的使用率超过 25%也需要将新生代对象移动至老生代