[TOC]
## 數據類型
[**基本類型有哪些?**]()
```
基本數據類型
Number 、String、Boolean、BigInt、Symbol、Undefined、Null
引用類型
Object(Function ,Array,Date,Math,)
```
* [ ] 判斷類型的方法有哪些?之間的區別是什么?
~~~jsx
let bool = true;
let num = 1;
let str = 'abc';
let und= undefined;
let nul = null;
let big = BigInt(1)
let arr = [1,2,3,4];
let obj = {name:'xiaoming',age:22};
let fun = function(){console.log('hello')};
let s1 = Symbol();
~~~
1. typeof
可以判斷基本類型(除Null),
~~~jsx
typeof num // 'number'
typeof str // 'string'
typeof bool // 'boolean'
typeof und// 'undefined'
typeof big // 'bigint'
typeof s1 // 'Symbol'
~~~
2. instanceof
可以判斷引用類型
3. Object.prototype.toString.call()
## 數組
[**數組有哪些方法**]()
~~~jsx
pop/some/find/push/unshift/shift/
~~~
[**哪些方法可以改變原數組**]()
~~~jsx
1. pop // 從最后一項移除 并返回移除的項目
2. push // 從數組后面添加一項,返回新的數組長度
3. shift // 從數組的最前面刪除一項,并返回該項
4. unshift // 從數組的最前面添加一項,并返回新的數組長度
5. reverse // 反轉數組
6. sort // 對數組進行排序
7. splice //三個參數。第一個代表開始的下標,第二個代表 要刪除的個數,第三個代表要替換的東西? ? ? ?返回被刪除的數組
~~~
[**for in , forof 有什么區別**]()
* for in 遍歷的數組的索引(即key 值)
for in會遍歷數組的所有可枚舉屬性,包括原型。所以更適合遍歷對象
* for of 遍歷數組的元素值
for of 不會遍歷枚舉屬性
[**forEach()、map()、reduce()、filter()的區別**]()
* 都不會改變原數組
* forEach 循環數組中每一個元素并采取操作,不返回新數組,不支持continue、break關鍵字,
* map 返回值是每一次執行的結果組成的新數組
* filter 過濾組成員 并返回新數組
* reduce 處理組成員 并返回一個值
[**數組去重有哪些方式**]()
* Array.from(New Set())
* 其他的可以利用數組的一些方法 和ES6的Map
[**數組和類數組的區別**]()
* 類數組 具有.length 屬性 但是不具有數組的方法
* 類數不能使用數組的方法
[**類數組怎么轉成數組**]()
~~~jsx
[].prototype.slice.call()
Array.from
~~~
## 閉包
[**什么是閉包?**]()
能調用另一個函數內的變量
[**閉包是如何產生的?**]()
外層函數調用后,外層函數的作用域對象無法釋放
[**用閉包有優缺點**]()
* .優點
` 減少了全局變量可以在內存中一直維持一個變量`
* 缺點
`由于得不到釋放,消耗內存
使用不當會造成內存溢出`
## THIS
[**創建對象的方式有哪些**]()
* new Object()
* Object.create()
* 字面量寫法
[**new Object() 和Object.create()有什么區別**]()
[**簡述一下什么是this**]()
this是個對象 在不同情況下this的指向不同
~~~jsx
1. 對象調用時this指向該對象
2. 直接調用的函數 this 指向window
3. 通過new 的方式 this 永遠指向新創建的對象
~~~
[**call、apply、bind、有什么區別**]()
* 都可以改變this
* call/apply 都會立即執行 bind 返回改變this 后的函數
* call 第二個參數接受參數列表 apply 第二個參數接受一個數組
## 原型 原型鏈
[**什么是原型、原型鏈**]()
* 原型
1. 原型包括隱式原型(__prot0__) 和顯示原型(prototype)
2. 所有的函數都有prototype(顯示原型)屬性,屬性值是一個普通對象指向函數的原型對象
3. 引用類型都有一個__proto__(隱式原型)屬性,指向構造函數的prototype
* 原型鏈 **原型鏈的鏈接是靠隱式原型鏈接的**
`當訪問一個對象屬性時,會先在對象本身查找,如果沒有找到就會去對象的__proto__(隱式原型)查找,即構造函數的prototype ,如果還沒有查找到,回去構造函數的prototype的__proto__查找。這樣一層層向上查找的鏈式結構,叫做原型鏈`
[**繼承
有哪些方法,他們直接的區別是什么**]()
## 深淺拷貝
[**什么是深淺拷貝**]()
* 淺拷貝 指向同一內存地址是共同使用一塊內存
* 深拷貝 會新開辟一塊內存空間 然后指向該內存空間
[**js中那些是深拷貝 那些是淺拷貝**]()
* 淺拷貝 ... assign
## 其他
[**JavaScript有哪些內置對象**]()
`Math Object Array Date RegExp JSON Promise parseInt等。。。`
[**JavaScript腳本延遲加載的方式有哪些?**]()
* 動態添加script 標簽
* defer 屬性
* async 屬性
* setTimeoute
* 讓js 最后加載
[**defer 和async 有什么區別和優缺點?**]()
* defer 腳本會被延遲到整個頁面都解析完畢之后再執
* async 加載完腳本后立即執行
缺點是 不能控制加載的順序
[**ajax、axios、fetch的區別?**]()
* Ajax
~~~jsx
1. 屬 js 原生
2. 容易產生回調地獄
~~~
* Axios
~~~jsx
1. 解決回調地獄問題
2. 支持Promise技術
3. 有超時處理
4. 有攔截器,可以對請求和響應統一處理
5. 瀏覽器兼容性良好
~~~
* Fetch
~~~jsx
1. 屬 js 原生
2. 基于 Promise 對象設計的,可以解決回調地獄問題
3. 默認不帶cookie,使用時需要設置
4. 沒有辦法檢測請求的 進度,無法取消或超時處理
~~~
[**什么是防抖、節流?**]()
1. 防抖
~~~jsx
1. 什么是防抖?
在事件被觸發n秒后再執行回調函數,如果在這n秒內又被觸發,則重新計時
2. 應用場景
輸入框連續輸入、resize、scroll事件
3. 原理
維護一個定時器,規定在delay時間后觸發函數,但是在delay 時間內再次觸發的話 會清空當前timer,然后重新計時
~~~
2. 節流
~~~jsx
1. 什么是節流?
單位時間內,只能有一次觸發事件的回調函數能執行。單位事件內觸發多次,只有一次生效
2. 應用場景
鼠標連續點擊、
3. 原理
判斷是否到達一定時間來觸發函數,
~~~