摘要:不允許直接訪問內存中的位置,也就是說不能直接操作對象的內存空間。在操作對象時,實際上是在操作對象的引用而不是實際的對象。解除引用的真正作用是讓值脫離執行環境,以便垃圾收集器下次運行時將其回收
1 基本類型和引用類型的值
基本數據類型是按值訪問的,因為可以操作保存在變量中的實際的值
基本類型值在內存中占據固定大小的空間,因此被保存在棧內存中
引用類型的值是保存在內存中的對象。JavaScript不允許直接訪問內存中的位置,也就是說不能直接操作對象的內存空間。在操作對象時,實際上是在操作對象的引用而不是實際的對象。為此,引用類型的值是按引用的。
1.1 動態的屬性以上關于引用類型的說法不嚴密,當復制保存著對象的某個變量時,操作的是對象的引用。但在為對象添加屬性時,操作的是實際的對象
引用類型的值是對象,保存在堆內存中
不能給基本類型的值添加屬性,盡管這樣做不會導致任何錯誤
1.2 復制變量值從一個變量向另一個變量復制基本類型的值,會創建這個值的一個副本
包含引用類型值的變量實際上包含的并不是對象本身,而是一個指向該對象的指針
1.3 傳遞參數ECMAScript中所有函數的參數都是按值傳遞的。也就是說,把函數外部的值復制給函數內部的參數,就和把值從一個變量復制到另一個變量一樣
1.4 檢測類型確定一個值是哪種基本類型可以使用typeof操作符,而確定一個值是哪種引用類型可以使用instanceof操作符
console.log(typeof s); //檢測變量s是哪種基本類型值 console.log(colors instanceof Array); //檢測變量colors是否引用類型Array2 執行環境及作用域
每個環境都有一個與之關聯的變量對象,環境中定義的所有變量和函數都保存在這個對象中。雖然我們編寫的代碼無法訪問這個對象,但解析器在處理數據時會在后臺使用它
2.1 延長作用域鏈執行環境的類型總共只有兩種——全局和局部(函數),但是還有其他辦法來延長作用域鏈
以下兩個語句都會在作用互聯的前端添加一個變量對象:
try-catch語句的catch塊
catch會創建一個新的變量對象,其中包含的是被拋出的錯誤對象的聲明
with語句
2.2 沒有塊級作用域with語句會將指定的對象添加到作用域鏈中
在if或者for語句中定義的變量在代碼塊執行結束后,會存在于代碼塊外部的執行環境中
3 垃圾收集 3.1 標記清除垃圾收集器在運行的時候會給儲存在內存中的所有變量都加上標記(當然,可以使用任何標記方式)。然后,它會去掉環境中的變量以及被環境中的變量引用的變量的標記。而在此之后再被加上標記的變量被視為準備刪除的變量,原因是環境中的變量以及無法訪問到這些變量了。最后,垃圾收集器完成內存清除工作,銷毀那些帶標記的值并回收它們所占用的內存空間
3.2 引用計數"標記清除"是目前主流的垃圾收集算法
引用計數的含義是跟蹤記錄每個值被引用的次數。當聲明了一個變量并將一個引用類型值賦給該變量時,則這個值的引用次數就是1。如果同一個值又被賦給另一個值,則這個值的引用次數減1。當這個值的引用次數變成0時,則說明沒有辦法再訪問這個值了,因而就可以將其占用的內存空間回收回來
這種引用計數策略存在一個嚴重的問題:循環引用
function problem(){ var objectA = new Object(); var objectB = new Object(); objectA.someOtherObject = objectB; objectB.anotherObject = objectA; }
上面例子中,objectA和objectB通過各自的屬性互相引用,它們的引用次數永遠不會是0。假如這個函數被重復多次調用,就會導致大量內存得不到回收
3.4 管理內存一旦數據不再有用,最好通過將其值設置為null來釋放其引用——這個做法叫做解除引用(dereferencing)
function createPerson(name){ var localPerson = new Object(); localPerson.name = name; return localPerson; } var globalPerson = createPerson("Nicholas"); globalPerson = null; //手工解除globalPerson的引用
解除一個值得引用并不意味著自動回收該值所占用的內存。解除引用的真正作用是讓值脫離執行環境,以便垃圾收集器下次運行時將其回收
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/82426.html
摘要:當代碼在一個環境中執行時,會創建變量對象的一個作用域鏈。作用域鏈的用途,是保證對執行環境有權訪問的所有變量和函數的有序訪問。這樣,一直延續到全局執行環境全局執行環境的變量對象始終都是作用域鏈中的最后一個對象。 變量、作用域和內存問題 基本類型和引用類型的值 基本類型值指的是簡單的數據段,而引用類型值值那些可能由多個值構成的對象。 定義基本類型值的引用和引用類型值的方法是類似的,創建...
摘要:在中雖然對象通過標記清除的方式進行垃圾收,但與對象卻是通過引用計數回收垃圾的,也就是說只要涉及及就會出現循環引用問題。如果垃圾收集例程回收的內存分配量低于,則變量字面量和或數組元素的臨界值就會加倍。 只挑本人重要的寫(有夾雜其他補充) 基本類型和引用類型的值 描述:基本類型值指的是簡單的數據段,而引用類型值指那些可能由多個值構成的對象。 動態的屬性 引用類型的值,我們可以為其添加屬性和...
摘要:如果在局部環境沒有找到該變量名,則繼續沿作用域鏈向上搜索。很明顯,訪問局部變量要比訪問全局變量更快,因為不用向上搜索作用域鏈。 按照ECMA-262定義,JavaScript的變量松散類型的本質,決定了: 它還只是在特定時間用于保存特定值的一個名字而已。 變量的值及其數據類型可以再腳本的生命周期內改變。 4.1 基本類型和引用類型的值 基本類型 簡單的數據段(Undefine...
摘要:引言滿滿的干貨,面試必系列,參考大量資料,并集合自己的理解以及相關的面試題,對核心知識點中的作用域閉包上下文進行了梳理。如果在小區這個作用域找到了張老師,我就會在張老師的輔導下學鋼琴我張老師房間鋼琴構成了學琴的上下文環境。 showImg(https://segmentfault.com/img/bVbo4hv?w=1800&h=1000); 引言 滿滿的干貨,面試必bei系列,參考大...
摘要:前言這段時間一直在消化作用域鏈和閉包的相關知識。而作用域鏈則是這套規則這套規則的具體運行。是變量對象的縮寫那這樣放有什么好處呢我們知道作用域鏈保證了當前執行環境對符合訪問權限的變量和函數的有序訪問。 前言:這段時間一直在消化作用域鏈和閉包的相關知識。之前看《JS高程》和一些技術博客,對于這些概念的論述多多少少不太清楚或者不太完整,包括一些大神的技術文章。這也給我的學習上造成了一些困惑,...
閱讀 2066·2021-11-11 16:54
閱讀 1046·2021-10-12 10:12
閱讀 386·2019-08-30 15:43
閱讀 652·2019-08-29 13:15
閱讀 1080·2019-08-29 13:12
閱讀 1531·2019-08-26 12:09
閱讀 1662·2019-08-26 10:24
閱讀 2263·2019-08-26 10:15