1. 说出执行结果,并解释
var a = []
for (var i = 0; i < 10; i++) {
a[i] = function() {
console.log(i)
}
}
a[6]()
结果:10
解释:因为for里面用的是var关键字声明的i,i的作用域是全局的,数组里的函数执行的时候访问的是循环结束后i的值,即10。
2.说出执行结果,并解释
var tmp = 123
if (true) {
console.log(tmp)
let tmp = 321
}
结果:执行报错
解释:”{}“里面是块级作用域,局部变量tmp屏蔽全局变量tmp,但是在使用之前访问tmp,而let又不会作用域提升,导致报错
3. 最简单的方式找出最小值
var arr = [10, 5, 2, 9, 7]
console.log(Math.min(...arr))
4.var、let、const的区别
1)var:定义变量,没有块的概念,可以跨块访问,不能跨函数访问,不初始化出现undefined,不会报错。
2)let:定义变量,只能在块作用域里访问,也不能跨函数访问,对函数外部无影响。
3)const:定义常量,只能在块作用域里访问,也不能跨函数访问,使用时必须初始化(即必须赋值),而且不能修改。
5.说出执行结果,并解释
var a = 10
var obj = {
a: 20,
fn() {
setTimeout(() => {
console.log(this.a)
})
}
}
obj.fn()
结果:20
解释:箭头函数内部本身并没有this值,其使用的this来自作用域链,来自更高层函数的作用域。
6. Symbol的用途
1. 作为对象属性名,防止被外部覆盖和直接修改
class Person {
// 1. 作为属性名,防止被外部覆盖和直接修改
nameKey = Symbol('name')
constructor(n) {
this[this.nameKey] = n
}
printName() {
console.log('origin:' + this[this.nameKey])
}
}
let person = new Person('James')
person.name = 'Kobe' // 外部添加属性
console.log('name:' + person.name)
person.printName()
// 输出:
//name:Kobe
//origin:James
2. 用于定义一组常量(枚举),保证这组常量的值都是不相等的。
const Direction = {
LEFT: Symbol('left'),
RIGHT: Symbol('right'),
UP: Symbol('up'),
Down: Symbol('down')
}
7. 关于深浅拷贝
例:
let array = [1, 2, 3, 4, 5]
let array2 = array
let array3 = Array.from(array)
// 对原对象操作
array.push(6)
console.log(array === array2) // true
console.log(array === array3) // false
console.log(array2) // [ 1, 2, 3, 4, 5, 6 ]
console.log(array3) // [ 1, 2, 3, 4, 5 ]
浅拷贝
复制一个指针,指向原对象所在的内存区域
image.png
深拷贝
将原对象指针所在的内存区数据重新复制一份,然后用一个新的指针指向该地址
image.png
8.TypeScript 和 JavaScript
image.png
TypeScript 是 JavaScript 的超集,扩展了 JavaScript 的语法,因此现有的 JavaScript 代码可与 TypeScript 一起工作无需任何修改,TypeScript 通过类型注解提供编译时的静态类型检查。
TypeScript 可处理已有的 JavaScript 代码,并只对其中的 TypeScript 代码进行编译。
9. TypeScript优缺点
9.1 优点
9.1.1增加代码的可读性和可维护性
- 增加类型系统使代码可读性更好
- 强类型判断,使很多错误在编译器就能排除
- 增加了IDE的代码提示和自动补全功能
9.1.2拥有活跃的社区
- 大部分第三方库都提供了TypeScript的类型定义文件
- Angular 2.0和Vue 3.0开始支持TypeScript
9.2缺点:
- 由于增加了很多现代语言的特性,例如接口,泛型,枚举等,增加了一定的学习成本
- 项目前期的开发正本会提高
- 集成到构建流程需要一些工作量
- 可能和一些库结合的不是很完美
10.描述引用计数的原理和优缺点
11.描述标记整理算法的流程
12.描述V8引擎新生代存储区垃圾回收机制
13.描述增量标记算法的工作原理
10 ~ 13 题见笔记:4种垃圾回收机制的对比