變數中包含基本數據類型和引用數據類型,基本類型指簡單的數據值,引用類型由多個值構成的對象. 引用類型可以為其添加屬性和方法,也可以改變和刪除屬性和方法. 複製變數值: 基本類型:一個變數向另一個變數複製基本類型的值,會在變數對象上創建一個新值,並把該值分配到新變數分配的位置上,兩者任何操作不會互相影 ...
變數中包含基本數據類型和引用數據類型,基本類型指簡單的數據值,引用類型由多個值構成的對象. 引用類型可以為其添加屬性和方法,也可以改變和刪除屬性和方法. 複製變數值: 基本類型:一個變數向另一個變數複製基本類型的值,會在變數對象上創建一個新值,並把該值分配到新變數分配的位置上,兩者任何操作不會互相影響. 引用類型:當一個變數向另一個變數複製引用類型的值時,同樣也會存儲在變數的值複製一份放到位新變數分配的空間中,但是不同的視,這個值的副本只是一個指針,而這個指針指向存儲在堆中的一個對象,兩個變數引用一個對象,改變其中一個變數,另一個也會隨之改變. 傳遞參數: 所有函數的參數都是按值傳遞的. 在向函數的參數傳遞基本類型值時,被傳遞的值會被覆制給一個局部的變數(命名參數.arguments對象中的一個元素) 在向參數傳遞引用類型的值時,即使是按值傳遞,指向的也是同一個對象,因為變數指向的對象在堆記憶體中只有一個. typeof操作符是一個確定一個變數是字元中數值,布爾值.undefined的最佳工具,如果變數是null或對象,則會返回object instanceof操作符是一個確定變數是引用類型的操作符. instanceof檢測引用類型和object構造函數時 return true instanceof檢測基本數據類型值時 return false 作用域: 最外圍的作用域為全局作用域,根據宿主環境不同,其表示作用域的對象也不同,未聲明的變數皆為全局變數. 除全局作用域以外的所有作用域皆為局部作用域,var聲明的變數為局部變數 js中沒有塊級作用域一說 作用域鏈: 是由局部作用域中的深層作用域由內向外冒泡尋找,一直到全局作用域. 局部作用域可以訪問全局作用域,但是全局作用域不可以訪問局部作用域中的變數. 延長作用域鏈 with()延長作用域鏈 實例 var person={}; with(person){ name="xiaoming"; sex="male"; }
基本數據類型 | 引用數據類型 |
不可修改 | 可以修改 |
保存在棧記憶體 | 保存在堆記憶體,指針地址保存在棧記憶體中 |
按值訪問 | 按引用訪問 |
比較時,值相等就相等 | 比較時,同一引用才相等 |
複製時,創建一個副本 | 複製時,,複製的其實只是一個指針 |
按值傳遞參數 | 按值傳遞參數 |
用typeof檢測類型 | 用instanceof檢測類型 |

垃圾收集: js是全自動的,不必像c和c++之類手動收集垃圾,可以讓我們少操心了. js中垃圾收集分為兩種,一種是標記清除法,還有一種是引用計數. 標記清除是垃圾收集器在運行的時候會給在記憶體中的所有變數都打上標記,然後,它會去掉環境中的變數和被環境中變數引用的變數的標記,而在此之後再被添加上標記的變數就被視為準備刪除的變數,原因是環境中的變數已經無法訪問到這些變數了,最後完成垃圾收集. 引用計數是跟蹤每個值被引用的次數,當聲明瞭一個變數並將一個引用類型值賦給該變數時,該值引用的次數加1,反之減1,為0時,說明無法訪問,收回所占用記憶體. 但是會涉及迴圈引用的問題,迴圈引用會導致永遠都不會被清理,一直占用記憶體,可將值設置為null來手動解除引用. js解析 1.預解析 當前作用域var和function關鍵詞的會事先聲明(變數提升),函數的優先順序比var聲明的優先順序高,var聲明的變數會被提升為undefined,聲明函數會把整個函數提升到最前面. 2.逐行解讀 個人理解,歡迎大佬們給提意見!!