## 一、
```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 能夠減少其維護成本
- 集成到構建流程需要一些工作量
- 可能和一些庫結合的不是很完美