ES新特性与TypeScript、JS性能优化

1 篇文章 0 订阅
1 篇文章 0 订阅

一.请说出下列的执行结果,并解释为什么

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%,回收复制后,空间不够用,新的对象 存不进去

 

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

老年代对象回收,主要采用标记清除,标记整理,增量标记算法

首先使用标记清除完成垃圾空间的回收

新生代对象晋升老生代对象,空间不足时使用标记整理算法

采用增量标记算法进行效率优化

当垃圾回收工作时会阻塞程序的运行,增量标记使垃圾回收和程序进行交替运行的,遍历对象进行标记,标记一部分,程序运行,再标记一部分,程序 在运行,最后清除,改变之前程序运行和垃圾回收一口气完成

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值