## 一、
```js
执行结果:10
说明:i是全局变量,a[i]在定义时没有立即执行,当循环体结束时,i的值为10,所以当a[6]执行时,函数中打印的i已经变成了10,打印输出了10
```
## 二
```js
执行结果:报错,提示tmp变量找不到
说明:var定义的变量存在变量提升,会先进行变量的声明,然后执行变量的赋值及使用。但是使用let定义的变量不存在变量提升,{}之间形成块级作用域,因为在当前块级作用域中声明了tmp变量,所以块级作用域中的tmp变量锁定了作用域,在未声明之前使用变量导致报错。
```
## 三
```js
var arr = [12,34,32,89,4];
return arr.sort((a,b) => {
return a-b;
})[0]
```
## 四
```html
var:变量声明,存在变量提升,定义的变量可后期发生改变;
let:变量声明,不存在变量声明,锁定作用域,在未声明之前不能使用该变量;
const:声明常量,不存在变量提升,在声明时必须赋值,赋值后不允许修改。
```
## 五
```
输出结果:10;
说明:setTimeout属于宏任务,会在主线程执行结束后调用,在主线程执行结束后定义的回调函数其实是在window下声明的,this指向window,获取到的值为10;
```
## 六
```
1.防止变量名起冲突
2.可以使用symbol避免魔术字符串
3.定义不重复的常量
4.symbol作为键名时,不被常规方法遍历出来,因此可以给对象定义非私有,但只用于内部使用的方法和属性
```
## 七
js中的数据类型包括基本数据类型和引用类型。基本数据类型因为使用比较频繁且内存占用较低,所以存放在内存中,但是引用类型以为占用内存比较大,存放在堆内存中。
浅拷贝指的是:在复制基本数据类型时,直接形成一个副本,在复制引用类型时,只是复制变量的引用指针,当修改其中一个对象的属性值时,另外一个对象的属性值也会发生改变。
常见的浅拷贝的方式:
- Object.assign()
- ES6的展开运算符...
- 数组的concat splice slice方法等
深拷贝:和浅拷贝相对的,深拷贝就是在数据中有引用类型的时候,无论改变原数据还是改变新数据都不会造成数据共享。
常用的深拷贝的方式:
JSON.parse(JSON.stringify())
## 八
ts是js的超集,新增了ES6的语法及类型判断
## 九
优点:
- TypeScript 增加了代码的可读性和可维护性
- TypeScript 非常包容
- TypeScript 拥有活跃的社区
缺点:
- 有一定的学习成本,需要理解接口(Interfaces)、泛型(Generics)、类(Classes)、枚举类型(Enums)等前端工程师可能不是很熟悉的概念
- 短期可能会增加一些开发成本,毕竟要多写一些类型的定义,不过对于一个需要长期维护的项目,TypeScript 能够减少其维护成本
- 集成到构建流程需要一些工作量
- 可能和一些库结合的不是很完美