一、
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三种声明变量方式之间的具体差别
- var定义的变量,没有块的概念,可以跨块访问, 不能跨函数访问。
- let定义的变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问。
- var声明的变量会挂载在window上,而let和const声明的变量不会
- 同一作用域下let和const不能声明同名变量,而var可以
- const用来定义常量,使用时必须初始化(即必须赋值),只能在块作用域里访问,而且不能修改,如果声明的是复合类型数据,可以修改其属性。
var a = 10
var obj = {
a: 20,
fn() {
setTimeout(() => {
console.log(this.a)
})
}
}
obj.fn()
执行结果: 20
结果分析:箭头函数的this指向声明时的对象,且调用时this指向不会发生改变
六、简述Symbol类型的用途
- 用于创建独一无二的值,可做唯一key用于缓存等场景
- 用于创建类的私有变量,利用symbol属性不能被枚举的特性声明作为私有属性
- 用来重置对象的属性,比如 Symbol.toStringTag
- 可实现 Symbol.iterator迭代器, 让普通对象变为可迭代对象
- 使用Symbol.for(‘xxx’)获取全局的symbol值
浅拷贝:也就是拷贝对象里面的数据,但是不拷贝对象里面的子对象
深拷贝:会克隆出一个对象,数据相同,但是引用地址不同(就是拷贝A对象里面的数据,而且拷贝它里面的子对象)
赋值:获得该对象的引用地址
此处借用一张图 (浅拷贝与深拷贝的区别)
和原数据是否指向同一对象 | 第一层数据为基本数据类型 | 原数据中包含子对象 | |
---|---|---|---|
赋值 | 是 | 改变会使原数据发生改变 | 改变会使原数据发生改变 |
浅拷贝 | 否 | 改变不会使原数据发生改变 | 改变会使原数据发生改变 |
深拷贝 | 否 | 改变不会使原数据发生改变 | 改变不会使原数据发生改变 |
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 的显著优势:
- 静态输入
- 大型的开发项目
- 更好的协作
- 更强的生产力
JavaScript 的优势
相比于 TypeScript,JavaScript 也有一些明显优势。
- 人气
- 学习曲线
- 本地浏览器支持
- 不需要注释
- 灵活性
如何抉择
TypeScript 正在成为开发大型编码项目的有力工具。因为其面向对象编程语言的结构保持了代码的清洁、一致和简单的调试。因此在应对大型开发项目时,使用 TypeScript 更加合适。如果有一个相对较小的编码项目,似乎没有必要使用 TypeScript,只需使用灵活的 JavaScript 即可。
十、描述引用计数的工作原理和优缺点。
核心思想:设置引用数,判断当前引用数是否为0。
引用计数器,引用关系改变时修改引用数字,引用数字为0时立即回收
优点:
- 发现垃圾时立即回收
- 最大限度减少程序暂停
- 无法回收循环引用的对象
- 时间开销大
核心思想:分标记和清除二个阶段完成
工作流程:遍历所有对象找标记活动对象 -> 遍历所有对象执行整理,移动对象位置->遍历所有对象清除没有标记对象 -> 回收相应的空间
十二、描述V8新生代存储区垃圾回收的流程
核心思想:
回收过程采用复制算法 + 标记整理
新生代内存区分为两个等大小空间
使用空间为From,空闲空间为To
活动对象存储于From空间
标记整理后将活动对象拷贝至To
From与To交换空间完成释放
注意:拷贝过程中可能会出现晋升,晋升就是将新生代对象移至老生代。一轮GC还存活的新生代需要晋升,To空间的使用率超过25%
十三、描述增量标记算法在何时使用及工作原理
工作原理
当垃圾回收的时候,会阻塞JavaScript程序的执行,也就是说程序执行完成后,会停下来去执行当前的回收操作,在这个过程中存在一定时间的空档期。所谓的标记增量其实就是将一整段的垃圾回收操作,拆分成多个小步组合着去完成当前的整个回收,去替换之前一次性做完的垃圾回收操作,该算法的主要优点是可以实现程序执行和垃圾回收交替完成,时间消耗上更合理一些。
程序运行的时候,是不需要进行垃圾回收的,一旦触发垃圾回收之后,无论采用何种算法,都会进行一个遍历和标记的操作(老年代存储区域)。
在遍历的过程中都需要做标记,而这个标记可以不一次性做完,因为它存在着一个直接可达和间接可达的操作,也就是说在处理的过程当中,我们第一步先找到第一层的可达对象,就可以停下来,让程序去执行一段时间,这段时间执行完成后,再让GC机制去执行二步的标记操作,比如它的下边会有一些子元素也是可达的,那就继续做标记,标记一轮后,再让GC停下来,继续回到程序执行,也就是所谓的交替去做这两件事情,直到最后标记操作完成以后,再去最终完成垃圾回收。
垃圾清除的这段时间,程序是不执行的,完成垃圾回收操作之后,程序再回到它该执行的地方继续执行
推荐阅读
- 操作系统|[译]从内部了解现代浏览器(1)
- web网页模板|如此优秀的JS轮播图,写完老师都沉默了
- JavaScript|vue 基于axios封装request接口请求——request.js文件
- vue.js|vue中使用axios封装成request使用
- JavaScript|JavaScript: BOM对象 和 DOM 对象的增删改查
- JavaScript|JavaScript — 初识数组、数组字面量和方法、forEach、数组的遍历
- JavaScript|JavaScript — call()和apply()、Date对象、Math、包装类、字符串的方法
- JavaScript|JavaScript之DOM增删改查(重点)
- javascript|vue使用js-xlsx导出excel,可修改格子样式,例如背景颜色、字体大小、列宽等
- javascript|javascript中的数据类型转换