JS變量、做用域

變量

定義

  能夠理解成一個存放數據的容器,方便屢次使用這個值數組

  跟ES6中const聲明的常量不一樣,變量意味着其值能夠變瀏覽器

注意點

  1.區分大小寫ide

  2.不用關鍵字和保留字函數

  3.命名有意義spa

  命名時,注意不用拼音帶數字序號的名稱,能夠用下劃線/駝峯來命名(例如BEM模式)3d

  在實際開發中,聽從整個團隊統一的命名規則code

 

數據類型

基本類型

  數字、字符串、布爾值、null、undefined對象

  基本類型的值不可修改,相似於化學中的原子(最小單位,不可再分割)blog

  (可能會認爲Number類型的值能夠修改,但實際上只是用新的數值覆蓋了舊的)生命週期

1 var str = "hello world';
2 var str1 = str.replace('o','');
3 //str並無改變,實際上建立了一個新的字符串並把改變後的字符串的值賦值給它
4 console.log(str);
5 console.log(str1);

  基本類型調用方法時,會找到其包裝對象,把屬性和方法借給基本類型,以後包裝對象消失

  保存在棧內存中,有序排列,大小固定,按照訪問

  值複製時只是把值複製了,複製後修改一個,另外一個不變

引用類型

  數組、對象

  值能夠修改,相似於化學中的分子(由多個原子/小分子組成,能夠分割)

 1 var myhome = {
 2     'name':'xh',
 3     'age':18,
 4     'sex':'male'
 5 }
 6 myhome.name = 'xm';
 7 delete myhome.sex;
 8 //分別輸出xm和undefined
 9 console.log(myhome.name);
10 console.log(myhome.sex);

  保存在堆內存中,大小不固定,依靠棧內存中保存的引用類型地址來訪問

  複製時爲地址引用的複製,複製後修改一個,另外一個也變化

  若是須要複製值,則須要遍歷對象中每個元素並複製,實現淺拷貝(只能複製基本類型)

 var myhome = {
    'name':'xh',
    'age':18,
    'sex':'male'
 };
 var anotherhome = {};
 for(p in myhome){
     anotherhome[p] = myhome[p];
 }
console.log(anotherhome.name);
console.log(anotherhome.age);
console.log(anotherhome.sex);
shallow copy

 

變量處理

變量相等的比較

  1.基本類型和基本類型:直接比較值

  2.引用類型和引用類型:指向同一個引用時才相等(若是判斷內容是否相等,須要遍歷其中元素並一一比較)

  3.基本類型和引用類型:==比較時,先試圖把引用類型進行轉換(例如數組變成數字),再比較值是否相等,===比較直接返回false

參數傳遞

  不管基本類型仍是引用類型,傳參時都是傳值(引用類型傳值實際是傳地址,但效果表現爲傳值)

  

類型檢測

  1.基本類型:用typeof

  2.引用類型:用instanceof(檢測是否爲某個引用類型的實例)

變量做用域及生命週期

  全局變量:在全局中聲明/沒有用var聲明的變量,一直到全部語句都執行完才被銷燬

  局部變量:用var在函數內部聲明的變量,所在的函數執行完就被銷燬

  

  

  JS中沒有塊級做用域(用{}括起來的範圍)

變量對象

  全局變量的對象是window,全部全局裏的變量和函數均可經過window.變量名/函數名訪問到

  經過window對象訪問其屬性時,即便該屬性(全局變量中的變量/函數)未定義,也不會報錯,只會返回undefined,而直接訪問該變量/函數時則報錯

  

 

做用域鏈

  當在某個局部做用域中查找某個對象時,會如今該局部做用域中查找,若是找不到,再向上一層,在上層局部做用域中查找,如此循環

  所以查找而產生的一條無形的做用域鏈,只能從內到外查找

  

  

延長做用域鏈的方法

  with會沿着當前局部區域查找對象,找到的話就在當前做用域進行對象值修改,不然就往上查找,找到後會在上一層級中修改變量的值

  但不建議使用with語句

  

 

JS解析機制

  JS先預解析,後逐行解讀代碼

  其中函數的參數會被當作該函數的局部變量對待

  

  預解析時,先查找全部var聲明的變量,將其賦值undefined,查找以function開頭的函數,並直接copy內容,以後往函數裏走,一樣對函數裏var聲明的局部變量賦值undefined,如此循環

  變量名和函數名衝突時,保留同名的函數

  函數名重複時,保留最後一個同名函數

  

  有些老版本的火狐瀏覽器,沒法預解析for、if等語句裏定義的函數,所以函數的定義建議放在全局中/函數的內部

   

  

   

垃圾收集

機制

  釋放無用的數據,回收內存以便後續使用,分爲自動收集(JS)和手動收集

原理

  找出沒用的數據,打上標記,釋放內存,這個過程被垃圾收集器週期性進行

  標識無用數據的策略:標記清除、引用計數(不經常使用,對循環引用會產生問題)

   

內存管理(解除引用)

  主要是針對全局對象,把其賦值null

相關文章
相關標籤/搜索