模块二:ES新特性、TypeScript和JS性能优化

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种垃圾回收机制的对比

你可能感兴趣的:(模块二:ES新特性、TypeScript和JS性能优化)