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

一、

var a =[] for(var i=0; i<10; i++) { a[i] = function() { console.log(i) } } a[6]()

执行结果: 10
结果分析:由于var声明的变量,没有块级作用域,可在全局使用,执行a[6]()时,循环体已执行完,每循环一次i的值都会被改变,且最终i的值为10,所以执行a[i<10]()时都为10
二、
var tmp = 123 if(true) { console.log(tmp) let tmp }

执行结果:报错
结果分析: let/const 命令会使区块形成封闭的作用域。若在声明之前使用变量,就会报错。
总之,在代码块内,使用 let 命令声明变量之前,该变量都是不可用的。
这在语法上,称为 “暂时性死区”( temporal dead zone,简称 TDZ)。
三、
let min = arr.reduce((pre, cur) => { return Math.min(pre, cur) })

四、请详细说明var,let,const三种声明变量方式之间的具体差别
  1. var定义的变量,没有块的概念,可以跨块访问, 不能跨函数访问。
  2. let定义的变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问。
  3. var声明的变量会挂载在window上,而let和const声明的变量不会
  4. 同一作用域下let和const不能声明同名变量,而var可以
  5. const用来定义常量,使用时必须初始化(即必须赋值),只能在块作用域里访问,而且不能修改,如果声明的是复合类型数据,可以修改其属性。
五、
var a = 10 var obj = { a: 20, fn() { setTimeout(() => { console.log(this.a) }) } } obj.fn()

执行结果: 20
结果分析:箭头函数的this指向声明时的对象,且调用时this指向不会发生改变
六、简述Symbol类型的用途
  1. 用于创建独一无二的值,可做唯一key用于缓存等场景
  2. 用于创建类的私有变量,利用symbol属性不能被枚举的特性声明作为私有属性
  3. 用来重置对象的属性,比如 Symbol.toStringTag
  4. 可实现 Symbol.iterator迭代器, 让普通对象变为可迭代对象
  5. 使用Symbol.for(‘xxx’)获取全局的symbol值
七、说说什么是浅拷贝,什么是深拷贝?
浅拷贝:也就是拷贝对象里面的数据,但是不拷贝对象里面的子对象
深拷贝:会克隆出一个对象,数据相同,但是引用地址不同(就是拷贝A对象里面的数据,而且拷贝它里面的子对象)
赋值:获得该对象的引用地址

此处借用一张图 (浅拷贝与深拷贝的区别)
和原数据是否指向同一对象 第一层数据为基本数据类型 原数据中包含子对象
赋值 改变会使原数据发生改变 改变会使原数据发生改变
浅拷贝 改变不会使原数据发生改变 改变会使原数据发生改变
深拷贝 改变不会使原数据发生改变 改变不会使原数据发生改变
八、请简述TypeScript与JavaScript之间的关系。
JavaScript
JavaScript 是一种轻量级的解释性脚本语言,可嵌入到 HTML 页面中,在浏览器端执行,能够实现浏览器端丰富的交互功能,为用户带来流畅多样的用户体验。
JavaScript 是基于对象和事件驱动的,无需特定的语言环境,只需在支持的浏览器上就能运行。
JavaScript 语言具有以下特点:
JavaScript 是一种脚本编写语言,无需编译,只要嵌入 HTML 代码中,就能由浏览器逐行加载解释执行。
JavaScript 是一种基于对象的语言,可以创建对象同时使用现有对象。但是 Javascript 并不支持其它面向对象语言所具有的继承和重载功能。
JavaScript 的语法简单,使用的变量为弱类型。
JavaScript 语言较为安全,仅在浏览器端执行,不会访问本地硬盘数据。
JavaScript 语言具有动态性。JavaScript 是事件驱动的,只根据用户的操作做出相应的反应处理。
JavaScript 只依赖于浏览器,与操作系统的因素无关。因此 JavaScript 是一种跨平台的语言。
【typescript|ES新特性与TypeScript、JS性能优化】JavaScript 兼容性较好,能够与其他技术(如 XML,REST API 等)一起使用。
TypeScript
TypeScript 是 Microsoft 开发和维护的一种面向对象的编程语言。它是 JavaScript 的超集,包含了 JavaScript 的所有元素,可以载入 JavaScript 代码运行,并扩展了 JavaScript 的语法。
TypeScript 具有以下特点:
TypeScript 是 Microsoft 推出的开源语言,使用 Apache 授权协议
TypeScript 增加了静态类型、类、模块、接口和类型注解
TypeScript 可用于开发大型的应用
TypeScript 易学易于理解
JavaScript 和 TypeScript 的主要差异
TypeScript 可以使用 JavaScript 中的所有代码和编码概念,TypeScript 是为了使 JavaScript 的开发变得更加容易而创建的。例如,TypeScript 使用类型和接口等概念来描述正在使用的数据,这使开发人员能够快速检测错误并调试应用程序
TypeScript 从核心语言方面和类概念的模塑方面对 JavaScript 对象模型进行扩展。
JavaScript 代码可以在无需任何修改的情况下与 TypeScript 一同工作,同时可以使用编译器将 TypeScript 代码转换为 JavaScript。
TypeScript 通过类型注解提供编译时的静态类型检查。
TypeScript 中的数据要求带有明确的类型,JavaScript不要求。
TypeScript 为函数提供了缺省参数值。
TypeScript 引入了 JavaScript 中没有的“类”概念。
TypeScript 中引入了模块的概念,可以把声明、数据、函数和类封装在模块中。
九、请谈谈你所认为的TypeScript优缺点。
TypeScript 的优势
下面列举 TypeScript 相比于 JavaScript 的显著优势:
  1. 静态输入
静态类型化是一种功能,可以在开发人员编写脚本时检测错误。查找并修复错误是当今开发团队的迫切需求。有了这项功能,就会允许开发人员编写更健壮的代码并对其进行维护,以便使得代码质量更好、更清晰。
  1. 大型的开发项目
有时为了改进开发项目,需要对代码库进行小的增量更改。这些小小的变化可能会产生严重的、意想不到的后果,因此有必要撤销这些变化。使用TypeScript工具来进行重构更变的容易、快捷。
  1. 更好的协作
当开发大型项目时,会有许多开发人员,此时乱码和错误的机也会增加。类型安全是一种在编码期间检测错误的功能,而不是在编译项目时检测错误。这为开发团队创建了一个更高效的编码和调试过程。
  1. 更强的生产力
干净的 ECMAScript 6 代码,自动完成和动态输入等因素有助于提高开发人员的工作效率。这些功能也有助于编译器创建优化的代码。
JavaScript 的优势
相比于 TypeScript,JavaScript 也有一些明显优势。
  1. 人气
JavaScript 的开发者社区仍然是巨大而活跃的,在社区中可以很方便地找到大量成熟的开发项目和可用资源。
  1. 学习曲线
由于 JavaScript 语言发展的较早,也较为成熟,所以仍有一大批开发人员坚持使用他们熟悉的脚本语言 JavaScript,而不是学习 TypeScript。
  1. 本地浏览器支持
TypeScript 代码需要被编译(输出 JavaScript 代码),这是 TypeScript 代码执行时的一个额外的步骤。
  1. 不需要注释
为了充分利用 TypeScript 特性,开发人员需要不断注释他们的代码,这可能会使项目效率降低。
  1. 灵活性
有些开发人员更喜欢 JavaScript 的灵活性。
如何抉择
TypeScript 正在成为开发大型编码项目的有力工具。因为其面向对象编程语言的结构保持了代码的清洁、一致和简单的调试。因此在应对大型开发项目时,使用 TypeScript 更加合适。如果有一个相对较小的编码项目,似乎没有必要使用 TypeScript,只需使用灵活的 JavaScript 即可。
十、描述引用计数的工作原理和优缺点。
核心思想:设置引用数,判断当前引用数是否为0。
引用计数器,引用关系改变时修改引用数字,引用数字为0时立即回收

优点:
  • 发现垃圾时立即回收
  • 最大限度减少程序暂停
缺点:
  • 无法回收循环引用的对象
  • 时间开销大
十一、描述标记整理算法的工作流程。
核心思想:分标记和清除二个阶段完成
工作流程:遍历所有对象找标记活动对象 -> 遍历所有对象执行整理,移动对象位置->遍历所有对象清除没有标记对象 -> 回收相应的空间
十二、描述V8新生代存储区垃圾回收的流程
核心思想:
回收过程采用复制算法 + 标记整理
新生代内存区分为两个等大小空间
使用空间为From,空闲空间为To
活动对象存储于From空间
标记整理后将活动对象拷贝至To
From与To交换空间完成释放
注意:拷贝过程中可能会出现晋升,晋升就是将新生代对象移至老生代。一轮GC还存活的新生代需要晋升,To空间的使用率超过25%
十三、描述增量标记算法在何时使用及工作原理
工作原理
当垃圾回收的时候,会阻塞JavaScript程序的执行,也就是说程序执行完成后,会停下来去执行当前的回收操作,在这个过程中存在一定时间的空档期。所谓的标记增量其实就是将一整段的垃圾回收操作,拆分成多个小步组合着去完成当前的整个回收,去替换之前一次性做完的垃圾回收操作,该算法的主要优点是可以实现程序执行和垃圾回收交替完成,时间消耗上更合理一些。
程序运行的时候,是不需要进行垃圾回收的,一旦触发垃圾回收之后,无论采用何种算法,都会进行一个遍历和标记的操作(老年代存储区域)。
在遍历的过程中都需要做标记,而这个标记可以不一次性做完,因为它存在着一个直接可达和间接可达的操作,也就是说在处理的过程当中,我们第一步先找到第一层的可达对象,就可以停下来,让程序去执行一段时间,这段时间执行完成后,再让GC机制去执行二步的标记操作,比如它的下边会有一些子元素也是可达的,那就继续做标记,标记一轮后,再让GC停下来,继续回到程序执行,也就是所谓的交替去做这两件事情,直到最后标记操作完成以后,再去最终完成垃圾回收。
垃圾清除的这段时间,程序是不执行的,完成垃圾回收操作之后,程序再回到它该执行的地方继续执行

    推荐阅读