一 , 请说出下列最终执行结果
var a = []for (var i = 0; i<10; i++) { a[i] = function() { console.log(i) }}
a[6]()解答: 10
二, 请说出下列最终的执行结果,并解释为什么?
var tmp = 123
if (true) { console.log(tmp) let tmp}解答: 会报错,因为console.log(tmp) 是在let 前打印的使用let命令声明变量之前,该变量都是不可用的
三, 结合ES6 新语法,用最简单的方式找出数组种的最小值
var arr = [12,34,32,89,4]console.log(Math.min(...arr));
四, 请详细说明var, let, const 三种声明变量的方式之间的具体差别
var: 声明的变量会变量提升,挂载在全局作用域上let: 属于块级作用域,同一作用域变量名不能相同const: 声明过后不能再修改,一旦声明必须赋值,不能使用null占位
五, 请说出下列代码最终输出的结果,并解释为什么?
var a = 10var obj = { a: 20, fn() { setTimeout(() => { console.log(this.a) }) }}obj.fn()解答: 20 ;虽然全局声明变量a = 10 ,但是fn()的方法是再obj对象里的,obj里对a 进行了重新赋值
六, 简述Symbol类型的用途
解答: symbol 最主要的作用是为对象添加独一无二的属性名;
1\. 可以作为扩展对象,属性名冲突问题
2.Symbol 可以实现私有成员
七, 说说什么是浅拷贝?什么是深拷贝?
浅拷贝:对内存地址的复制,让目标对象指针和源对象指向同一片内存空间 深拷贝: 拷贝对象的具体内容,二内存地址是自主分配的,拷贝结束之后俩个对象虽然存的值是一样的,但是内存地址不一样,俩个对象页互相不影响,互不干涉
八,请简述TypeScript 与JavaScript之间的关系
typescript: 是强类型,静态类型;从语言层面限制函数的实参类型必须于形参类型相同,不允许隐式转换 1\. 强类型代码错误更早暴露 2\. 强类型代码更智能,编码更准确 3\. 重构更可靠,重构更可靠 4\. 减少了代码层面的不必要的类型判断javascript: 是弱类型,动态类型;不会限制实参的类型,允许隐式转换 1\. 异常需要等到运行时才能发现 2\. 函数功能可能发生改变 3\. 对象索引器的错误用法 const obj = {} obj[true] = 100 // 属性名会自动转换为字符串 console.log(obj['true']) 君子约定由隐患,强制要求有保障它俩之间的区别就是是否允许类型转换1.TypeScript是javascript的一个超集或者是扩展集 2\. 任何一种javascript运行环境都支持
九,请谈谈你所认为的TypeScript 优缺点
typescript : 1\. 避免类型异常 2.支持转换es6中的新特性 3\. 最低能编译到es3版本的代码(兼容好) 4\. 任何一种javascript运行环境都支持 5\. 功能更为强大,生态也更健全,更完善 angular/vue3.0缺点: 1\. 语言本身多了很多概念 (属于渐进式) 2\. 项目初期,typeScript 会增加一些成本 (大型项目就不会在意这些成本)
十, 描述引用计数的工作原理和优缺点
工作原理: 核心思想:设置引用数,判断当前引用数是否为0 引用计数器 引用关系改变时修改引用数字 引用数字为0时立即回收引用计数算法优点 1\. 发现垃圾时立即回收 2\. 最大限度减少程序暂停引用计数算法缺点 1\. 无法回收循环引用的对象 2\. 时间开销大
十一, 描述标记整理算法的工作流程
1\. 第一步会先遍历所有对象找标记活动对象
2\. 第二步清除阶段会先执行整理,移动对象位置
十二, 描述V8 中新生代存储区垃圾回收的流程
新生代对象回收实现 1\. 回收过程采用复制算法 + 标记整理 2\. 新生代内存区分二个等大小空间 3\. 使用空间为From,空闲空间为to 4\. 活动对象存储于From空间 5\. 标记整理后将活动对象拷贝至To 6\. From 与To交换空间完成释放 回收细节说明: 1\. 拷贝过程中可能出现晋升 2\. 晋升就是将新生代对象移动至老生代 3\. 一轮GC还存活的新生代需要晋升 4\. To 空间的使用率超过25% (25% 是因为到最后From和To交换空间时,如果过多,新的对象就无法存储进来)