##### 變量類型和計算
### 一.typeof能判斷哪些數(shù)據(jù)類型
識別所有值類型:? 布爾型? undefined? ? 數(shù)字? 字符串? syblom
識別函數(shù)
判斷是否是引用類型(不可再細分)
判斷所有值類型杰标,能判斷函數(shù)串纺,能識別引用類型
#### 值類型和引用類的區(qū)別
**總結(jié):**
1.值類型有更好的效率蓄诽,但不支持多態(tài)茅茂,適合用作存儲數(shù)據(jù)的載體苍匆。而引用類型支持多態(tài)朋魔,適合用于定義程序的行為。
2.引用類型可以派生新的類型唾戚,而值類型不能柳洋。
```
1.對象的傳遞:
將值類型的變量賦值給另一個變量,會執(zhí)行一次賦值叹坦,賦值變量包含的值熊镣;
將引用類型的變量賦值給另一個引用類型變量,它復(fù)制的是引用對象的內(nèi)存地址募书,在賦值后就會多個變量指向同一個引用對象實例绪囱。
2.參數(shù)按值傳遞:
對于值類型(stu1),傳遞的是該值類型實例的一個副本莹捡,因此原本的值stu1并沒有改變鬼吵;
對于引用類型(Student stu2),傳遞是變量stu2的引用地址(即stu2對象實例的內(nèi)存地址)拷貝副本道盏,因此他們操作都是同一個stu2對象實例而柑。
3.參數(shù)按引用傳遞:
不管是值類型還是引用類型文捶,可以使用ref或out關(guān)鍵字來實現(xiàn)參數(shù)的按引用傳遞荷逞。ref或out關(guān)鍵字告訴編譯器媒咳,方法傳遞的是參數(shù)地址,而非參數(shù)本身种远。
在按引用傳遞時涩澡,方法的定義和調(diào)用都必須顯式的使用ref或out關(guān)鍵字,不可以省略坠敷,否則會引起編譯錯誤
注:string與一般引用類型有區(qū)別妙同。以下是我對string與其他引用類型進行比較,發(fā)現(xiàn)的不同膝迎,所編寫的程序代碼
```
### 二.手寫深拷貝
```
<script>
//注意判斷值類型和引用類型
//注意判斷是數(shù)組還是對象
//遞歸
const obj1 = {
? ? age:20,
? ? name:'777',
? ? address:{
? ? ? ? city:"beijing"
? ? },
? ? arr:['a','b','c']
}
const obj2 =deepClone(obj1)
obj2.address.city="shanghai"
obj2.arr[0] ='aaa'
console.log(obj1.address.city);
console.log(obj2.arr[0])
/*
深拷貝
@param {Object} obj 要拷貝的對象
*/
function deepClone(obj = {}){
? ? if(typeof obj !== "object" || obj == null){
? ? ? ? // obj 是null粥帚,或者不是對象和數(shù)組,直接返回
? ? ? ? return obj
? ? }
? ? // 初始化返回結(jié)果
? ? let result
? ? //判斷是否是一個對象
? ? if(obj instanceof Array){
? ? ? ? result =[]
? ? }else{
? ? ? ? result = []
? ? }
? ? for(let key in obj){
? ? ? ? if(obj.hasOwnProperty(key)){
? ? ? ? ? ? //遞歸調(diào)用
? ? ? ? ? ? result[key] = deepClone(obj[key])
? ? ? ? }
? ? }
? ? //返回結(jié)果
? ? return result
}
</script>
```
## 三.變量計算-類型轉(zhuǎn)換
1.運算符:除了 == null之外限次,其他都一律用 ===
2.if語句和邏輯運算
```
truly 變量 : !!a===true的變量
falsely變量:!!a === false的變量
```
## 四.原型和原型鏈
如何準確判斷一個變量是不是一個數(shù)組
手寫一個簡易的jQuery,考慮插件和擴展性‘
class的原型本質(zhì)芒涡,怎么理解?
class和繼承
constructor
類型判斷instanceof
原型和原型鏈