乐趣区

关于typescript:ES新特性与TypeScriptJS性能优化

一、

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 对象外面的数据,而且拷贝它外面的子对象)
赋值 :取得该对象的援用地址

此处借用一张图(浅拷贝与深拷贝的区别)

<span style=”color: #429363″> 和原数据是否指向同一对象 <span style=”color: #429363″> 第一层数据为根本数据类型 <span style=”color: #429363″> 原数据中蕴含子对象 </span>
赋值 扭转会使原数据产生扭转 扭转会使原数据产生扭转
浅拷贝 扭转不会使原数据产生扭转 扭转会使原数据产生扭转
深拷贝 扭转不会使原数据产生扭转 扭转不会使原数据产生扭转

八、请简述 TypeScript 与 JavaScript 之间的关系。
JavaScript
JavaScript 是一种轻量级的解释性脚本语言,可嵌入到 HTML 页面中,在浏览器端执行,可能实现浏览器端丰盛的交互性能,为用户带来晦涩多样的用户体验。

JavaScript 是基于对象和事件驱动的,无需特定的语言环境,只需在反对的浏览器上就能运行。

JavaScript 语言具备以下特点:

JavaScript 是一种脚本编写语言,无需编译,只有嵌入 HTML 代码中,就能由浏览器逐行加载解释执行。

JavaScript 是一种基于对象的语言,能够创建对象同时应用现有对象。然而 Javascript 并不反对其它面向对象语言所具备的继承和重载性能。

JavaScript 的语法简略,应用的变量为弱类型。

JavaScript 语言较为平安,仅在浏览器端执行,不会拜访本地硬盘数据。

JavaScript 语言具备动态性。JavaScript 是事件驱动的,只依据用户的操作做出相应的反馈解决。

JavaScript 只依赖于浏览器,与操作系统的因素无关。因而 JavaScript 是一种跨平台的语言。

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 停下来,持续回到程序执行,也就是所谓的交替去做这两件事件,直到最初标记操作实现当前,再去最终实现垃圾回收。

垃圾革除的这段时间,程序是不执行的,实现垃圾回收操作之后,程序再回到它该执行的中央继续执行

退出移动版