一.请说出下列的执行结果,并解释为什么
var a = [];
for(var i = 0; i<10;i++) {
a[i] = function() {
console.log(i);
}
}
a[6]();
结果为10,for循环执行完之后a数组每隔成员只是赋值了一个函数,循环体中的变量i执行后就变成了10,函数执行后查找作用域链查到i为10,所以不管数组中的哪个函数执行后都打印10
二.请说出下列的最终的执行结果,并解释为什么
var tmp = 123
if(true){
console.log(tmp);
let tmp
}
会报语法错误,未声明就被使用。
在判断作用域中,能找到就会用作用域中的变量,可以找到声明的tmp,但在未声明前使用,所以报语法错误
如果去掉判断作用域中的声明,则会在作用域链中的上层寻找,可以找到,打印123
三.结合ES6新语法,用最简单的方式找出数组中的最小值
var arr = [12,34,32,89,4]
const result = arr.reduce((last,current) => {
if(last<current){return last;}
return current;
})
console.log(result)
四.请详细说明var,let,const三种声明变量的方式之间的具体差别
在es6之前只有两种作用域 全局作用域和函数作用域,在es6之后又出现了块级作用域,块就是用一组花括号包裹起来的范围,if和 for都会产生块
var 是全局作用域,在if和for中声明过后,在外部也能访问,let在块级作用域中定义,外部不能访问,var会变量提升,如先打印未声明的变量,在之后声明,不会报错
cons是在let 的基础上多了一个只读,声明过后不允许再被修改,const 只能在声明的时候赋值
不能被修改只是说不能指向一个新的内存地址,并不是说,不能修改恒量中的属性成员
五.请说出下列的最终的执行结果,并解释为什么
var a = 10
var obj = {
a:20,
fn(){
setTimeout(() => {
console.log(this.a)
}, 0);
}
}
obj.fn()
输出20
是先声明了一个a和一个obj对象
然后执行obj.fn的函数,执行时出现定时器,定时器中的箭头函数为声明是确认this指向,而此时的this指向obj,obj的a属性为20,所以打印20
六.简述symbol类型的用途
很多时候需要去扩展第三方组件的对象,不知道某一个对象中存在的属性的,贸然去扩展就会出现冲突问题,为了解决这种问题,所以采用symbol
还可以实现对象的私有成员,声明symbol,内部可以访问,外部不能访问,这样可以实现对象的私有化
目前最主要的就是为对象添加独一无二的属性名
七.说说什么是浅拷贝,什么是深拷贝
浅拷贝就是复制对象时只复制对象的内存地址,当一个对象发生改变时,都会发生改变
深拷贝就是开辟一个新的内存空间,保存数据,当一个对象发生改变时,不会互相影响
八.请简述TypeScript和JavaScript之间的关系
TypeScript是基于JavaScript之上的编程语言,JavaScript的超集,JavaScript之上多了一些扩展特性,类型系统和es6+的支持,最终会被编译为最原始的JavaScript
TypeScript解决了JavaScript自由的类型系统的不足,大大提高代码的可靠程度,TypeScript是此类问题的最终极解决方案
九.请谈谈你所认为TypeScript的优缺点
TypeScript能更早的暴露错误,代码更加智能,编码更准确,重构更加牢靠(编译过后,能直接表现出来),减少不必要的类型判断
最终会被编译为最原始的JavaScript,任何JavaScript 的运行环境下都支持
TypeScript是渐进式的 ,即便不懂新概念也可以用JavaScript来开发
缺点:语言本身多了很多概念,项目初期TypeScript会增加一些成本,声明很对对象声明,适合大型项目
十.描述引用计数的工作原理和优缺点
原理
核心思想:设置引用数,判断当前 引用数是否为零
引用计数器,会消耗性能
引用关系改变时修改引用数字,如果一个对象的内存地址指向一个变量,或者又有一个 变量的内存地址指向它,就会发生改变,相对加一或减一
引用数字为0是时gc立即回收
优点
发现垃圾时立即回收
最大限度减少程序暂停
缺点
无法回收循环引用的对象
时间开销大
十一.描述标记整理算法的工作流程
标记整理算法是标记清除的增强
标记阶段的操作和标记清除一致,把所有的活动对象标记
清除阶段会先执行整理,移动位置对象,使之成为连续的空间对象
十二.描述v8中新生代存储区垃圾回收的流程
新生代对象指的就是存活时间较短的对象
回收过程中采用复制算法和标记整理的算法
新生代内存区分为两个等大小空间
使用空间为From,空闲空间为To
活动对象储存于From空间
标记整理后将活动对象拷贝至To
From和To交换空间完成释放
回收的细节
拷贝过程中,可能出现晋升,晋升就是将新生代对象移动至老生代,一轮cg之后还存活的新生代对象需要晋升,To空间的使用率超过25%,To空间使用超过80%,回收复制后,空间不够用,新的对象 存不进去
十三.描述增量标记算法在何时使用及工作原理
老年代对象回收,主要采用标记清除,标记整理,增量标记算法
首先使用标记清除完成垃圾空间的回收
新生代对象晋升老生代对象,空间不足时使用标记整理算法
采用增量标记算法进行效率优化
当垃圾回收工作时会阻塞程序的运行,增量标记使垃圾回收和程序进行交替运行的,遍历对象进行标记,标记一部分,程序运行,再标记一部分,程序 在运行,最后清除,改变之前程序运行和垃圾回收一口气完成