第一阶段.模块二:ES新特性与TypeScript、JS性能优化

文章内容输出来源:拉勾教育大前端高薪训练营
文章说明:文章内容为学习笔记,学徒之心,仅为分享; 如若有误,请在评论区指出,如若您觉得文章内容对您有一点点帮助,请点赞、关注、评论,共享

一、请说出下列最终得执行结果,并解释为什么。


最终结果:10
  首先该段代码在全局作用域中声明了个空数组a,
  然后for 循环时是使用 var 定义循环变量 i (存在变量提升),且i++并不是重新定义了一个变量,只是对i变量重新赋值了,最终循环结束时i等于10
  由于function(){console.log(i)}并没有立即执行,所以等for循环执行结束后,i已经变成10了,所有的a[i]输出的都是10。
  但是在ES6中,let声明的变量仅在块级作用域有效,所以这里的i只在本轮循环有效果,每次循环的i其实都是一个新的变量,因此把var i = 0变成let i = 0故a[6],输出结果就可以变成6

二、请说出下列最终得执行结果,并解释为什么。


最终结果:报错(应该是tmp没有被定义)
  代码首先执行 var temp = 123 在全局作用域中声明了全局变量tmp并赋值为123 , 然后执行if语句,为真,进入if语句,执行 console.log(tmp),这个时候,就会在最近的作用域内找tmp,发现 在和console.log(tmp)同一个作用域下有tem, 但是tem是用let关键字来声明的,因为let没有变量提升,所以在let tmp声明前,使用tmp会报错

三、结合ES6新语法,用最简单的方式找出数组中的最小值。

console.log(Math.min(...arr))

四、请详细说明var、let、const三种声明变量方式之间的具体差别

1、使用var声明变量
  1.存在变量提升
  2.访问在后续定义的变量,会返回undefined ,不会报错
  3.var没有块级作用域,其声明的变量在其他作用域中可以访问到
2、使用let声明变量
  1.使用let声明的变量,会创建一个块级作用域
  2.let声明的变量只在块级作用域内有效,在外部访问不到
  3.同个作用域内,使用let不能重复声明变量
  4.变量在声明之前就调用,会报错
3、使用const声明常量
  1.使用const声明的变量不能被修改,常用来声明常量
  2.使用const声明常量时必须马上赋值
  3.使用const声明引用类型数据的常量时,其指向的是该对象的指针,所以可以在这个常量上增加、删除、修改对象的属性,但是不能直接修改这个常量的值(内存地址不能修改)

五、请说出下列代码最终得执行结果,并解释为什么。

最终结果:20
  一共有2个a,一个是在全局内定义的变量var a = 10,一个是在obj对象内定义的变量 a:20,调用obj.fun()函数,会执行setTimeout,由于setTimeout第一个参数是箭头函数,打印this.a,因为箭头函数不会创建自己的this,它只会从自己作用域链的上一层继承this,所以这里的this指向的是obj对象,同时obj对象内正好有a:20,因此打印出来的结果是20

六、简述Symbol 类型的用途。

Symbol是es6新增一种新的原始数据类型,其主要用途有:
  1.为对象创建独一无二的key值
  2.可以模拟对象的私有属性
  3.可以用作常量

七、说说什么是浅拷贝,什么是深拷贝

变量存储类型分两类
①基本类型:直接存储在栈中的数据。(字符串、布尔值、未定义、数字、null)
②引用类型:将该对象引用地址存储在栈中,然后对象里面的数据存放在堆中。(数组、对象、函数)
浅拷贝:只是复制了对象的引用地址,两个对象指向同一个内存地址,所以修改其中任意的值,另一个值都会随之变化(例:assign())
深拷贝:会克隆出一个对象,数据相同,但是引用地址不同,两个对象修改其中任意的值,另一个对象中的值不会改变(例:JSON.parse()和JSON.stringify(),但是此方法无法复制函数类型)

浅拷贝和深拷贝

八、请简述TypeScript与JavaScript之间的关系。

1、TypeScript是 JavaScript 的超集/扩展集,包含了 JavaScript 的所有元素,可以载入 JavaScript 代码运行,并扩展了 JavaScript 的语法
2、TypeScript 可以使用 JavaScript 中的所有代码和编码概念,TypeScript 是为了使 JavaScript 的开发变得更加容易而创建的
3、TypeScript 从核心语言方面和类概念方面对 JavaScript 对象模型进行扩展
4、JavaScript 代码可以在无需任何修改的情况下与 TypeScript 一同工作,同时可以使用编译器将 TypeScript 代码转换为 JavaScript
5、TypeScript 通过类型注解提供编译时的静态类型检查
6、TypeScript 中的数据要求带有明确的类型,JavaScript不要求
7、TypeScript 为函数提供了缺省参数值
8、TypeScript 引入了 JavaScript 中没有的“类”概念
9、TypeScript 中引入了模块的概念,可以把声明、数据、函数和类封装在模块中

什么是动态类型语言和静态类型语言
简单来说,一门语言在编译时报错,那么就是静态类型语言,如果在运行时报错,那么就是动态语言
javascript是运行时才知道错误,所以它是动态类型语言
typescript是编译时就会知道错误,所以它是静态类型语言

ES6是什么
ECMAScript 6.0(以下简称ES6)是JavaScript语言(现在是遵循ES5标准)的下一代标准,已经在2015年6月正式发布了。它的目标,是使得JavaScript语言可以用来编写复杂的大型应用程序,成为企业级开发语言。

ECMAScript和JavaScript的关系
由于JavaScript的创造者Netscae公司的版权问题,ECMAScript不能叫Javascript。总之,ECMAScript和JavaScript的关系是,前者是后者的规格(语言规范),后者是前者的一种实现。

JavaScript 与 TypeScript 的关系
TypeScript是Javascript的超集,实现以面向对象编程的方式使用Javascript。当然最后代码还是编译为Javascript。

TypeScript和ES6的关系
ES6是Javascript语言的标准,typescript是ES6的超集

九、请谈谈你所认为的TypeScript优缺点。

优点:
1.TypeScript 增加了代码的可读性和可维护性
2.TypeScript 非常包容
3.TypeScript 拥有活跃的社区
缺点:
1.有一定的学习成本,需要理解新的概念和使用方法例如:接口(Interfaces)、泛型(Generics)、类(Classes)、枚举类型(Enums)等
2.短期可能会增加一些开发成本,毕竟要多写一些类型的定义,不过对于一个需要长期维护的项目,TypeScript 能够减少其维护成本
3.集成到构建流程需要一些工作量
4.可能和一些库结合的不是很完美

十、描述引用计数的工作原理和优缺点。

工作原理:其核心思想是设置引用数,判断当前引用数是否为0;其实现方式是通过设置引用计数器,并根据引用关系变化时修改引用数字,当引用数字为0时,GC(垃圾回收机制)就会立即工作,将当前对象的空间进行回收
优点:发现垃圾时能立即回收;最大限度减少了程序暂停
缺点:无法回收循环引用的对象;时间开销较大

十一、描述标记整理算法的工作流程。

标记整理算法的工作流程原理:
标记整理可以看作是标记清除的增强,它也是分为标记和清除两个阶段
标记阶段:该阶段将作用域中所有可达对象进行标记,标记阶段的操作和标记清除一致
清除阶段:该阶段会先进行整理,移动对象位置,让它们在地址上产生连续,然后进行清除操作,回收相应的空间
优点:减少碎片化空间
缺点:不会立即回收垃圾对象;移动对象位置,回收效率慢

十二、描述V8中新生代存储区垃圾回收的流程

新生代对象回收实现:
1.回收过程采用复制算法 + 标记整理
2.新生代内存区分为两个等大小空间From和To
3.使用空间为From,空闲空间为To
4.活动对象存储于From空间,当From空间使用到一定程度后便会触发GC(垃圾回收机制)操作
5.对From空间进行活动对象的标记,并进行整理
6.将整理后的活动对象拷贝至To
7.对From空间进行回收操作
8.From与To的空间位置交换完成释放
回收细节说明:
1.拷贝过程中可能出现晋升
2.晋升就是将新生代对象移动至老生代对象中
3.一轮GC过后还存活的新生代对象需要晋升到老生代中
4.To空间的使用率超过25% 也会晋升到老生代中

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

增量标记算法:它是在V8引擎清除老生代对象时为提高清除效率优化时使用的,因为在进行垃圾回收的操作时会阻塞程序的执行,所以在老生代中会在程序执行的空档期去执行回收操作,此时就可以使用增量标记算法。它是将当前一整段的垃圾回收操作,分成多个小步组合去完成,实现垃圾回收和程序执行交替完成,可以让时间消耗更合理,达到效率优化的好处
工作原理
1.JS程序执行过程中,会伴随着垃圾回收的工作
2.当垃圾回收工作时,需要遍历对象进行标记,此时不需要将所有对象进行标记,可以先将直接可达的对象进行标记,标记完成后暂停标记
3.然后让JS程序执行一会,再让GC机制去做二步标记,将间接可达的对象进行标记,标记完成后暂停标记
4.重复以上两个操作,让程序执行和垃圾回收的标记操作交替执行,来达到优化效率和提升用户体验的目的
5.直到标记全部完成后,执行垃圾回收

增量标记算法.png

结语:
拉钩教育训练营学习已经有二周了,在没有来之前,我都是回家之后打游戏(游戏名:斗战神),来到这里之后才发现居然还有很多大佬也在学习,真的很惊讶,本人自身水平垃圾的一批,再不学习,以后可能一直就是混吃等死的状态了

  • 首先来说,拉钩的课程很干,每个视频很短,都是干货,讲师没有一句废话,视频内容覆盖比较广,布置的作业也比较符合实际,导师也会及时批改,然后一周或两周必有直播,直播都会回答学习过程中所遇到的问题和新的内容
  • 其次来说,每个班都有班级群,群里居然还有5年6年的前端开发的大佬(⊙▽⊙); 班主任和导师也在群里,有任何问题都可以在群里@导师,班级群真的很活跃
  • 最后来说一句,如果有其他人也是在打游戏混日子,不如来拉钩教育训练营,尝试着改变一下自己目前所处的环境

你可能感兴趣的:(第一阶段.模块二:ES新特性与TypeScript、JS性能优化)