4.1基本類型和引用類型的值es6
4.2執行環境及做用域web
4.3垃圾收集svg
ES變量包含基本類型值和引用類型值函數
基本類型指的是簡單的數據段,包括Undefined、Null、Boolean、Number、Stringspa
引用類型值指的是那些可能由多個值構成的對象,包括Object,能夠添加屬性和方法.net
ES6 引入了一種新的原始數據類型Symbol,表示獨一無二的值。它是 JavaScript 語言的第七種數據類型設計
對於基本類型而言,若是從一個變量向另外一個變量複製,會在變量對象上建立一個新值,而後將該值複製到爲新變量分配的位置指針
var a = 1 var b = a
對於引用類型而言,一樣也會複製一份放到爲新變量分配的空間中,不一樣的是這個值其實是一個指針,指針指向存儲在堆中的一個對象,複製結束後,兩個變量實際上引用了同一個對象code
var obj1 = new Object() var obj2 = obj1 obj1.name = "fur" console.log(obj2.name) //fur
注意:訪問變量有按值和按引用兩種方式,而參數只能按值傳遞。xml
傳遞基本類型時會把值複製給一個局部變量(命名參數),傳遞引用類型時會把這個值在內存在的地址複製給一個局部變量,所以這個局部變量的變化會反映函數外部
function add(num){ num +=10 return num } var count = 20 var result = add(count) console.log(result)//30 console.log(count)//20
所以基本類型不會印象函數外部的count變量,可是引用類型會改變
function setNum(obj){ obj.num =30 } var count = new Object() count.num = 20 setNum(count); console.log(count.num)//30
不少人錯誤理解爲引用類型的參數是引用傳遞,實際上是按值傳遞的,再看修改後的代碼
function setNum(obj) { obj.num = 30 console.log(obj) //Object { num: 30 } obj = new Object() obj.num = 40 console.log(obj) //Object { num: 40 } } var count = new Object() count.num = 20 setNum(count); console.log(count) //Object { num: 30 } console.log(count.num) //30
若是count是引用類型傳遞,那麼count就會自動被修改成指向40,因此證實是值傳遞,實際上,函數內部重寫obj,這個變量引用就是一個局部對象,函數執行完當即銷燬。
書裏這個地方說得有點理所固然,因此又找了找別的解釋:
關鍵在於obj = new Object()
則會個地方會覆蓋obj保存的指向count的地址值,使其指向新地址,那麼此時的obj已是一個局部變量,並且地址的改變使你不管對它進行什麼操做都不會影響到原來的obj上面來。
typeof:適用於檢測基本類型
instanceof:適用於檢測引用類型
var name = "fur" var u var n = null var o = new Object() console.log(typeof name)//string console.log(typeof u)//undefined console.log(typeof n)//object,這個須要注意 console.log(typeof o)//object
instanceof:適用於檢測引用類型
var arr = new Array() var o = new Object() console.log(arr instanceof Array)//true console.log(arr instanceof Object)//true 由於Object包括Array console.log(o instanceof Array)//false console.log(arr instanceof Object)//true
執行環境定義了變量或函數有權訪問的其餘數據,決定它們自身的行爲,每一個執行環境都有與之關聯的變量對象,環境中定義的全部變量和函數都保存在這個對象裏。
做用域鏈:保證對執行環境有權訪問的全部變量和函數的有序訪問,便可以訪問本身以及本身父級以上的變量
經過代碼說明
var name = "fur" function changeName(){ if(name === "fur"){ name = "fur1" }else{ name = "fur2" } } changeName(); console.log(name)//fur1
由此,changeNamed的做用域鏈包括本身的變量對象和全局環境的變量對象。
沒有塊級做用域,這個專指var,做用域只能限制在函數內,而沒法像Java同樣限制在塊級內,可是ES6已經出現了let和count兩種新的聲明變量的方法,能夠實現塊級做用域,let能夠修改,count不可修改
JavaScript具備自動垃圾收集機制
原理:找到再也不使用的變量,釋放其內存,垃圾收集器會按照固定的時間間隔週期性執行,方式主要有標記清理
標記清除:變量進入環境打上標記「進入環境」,離開環境打上標記「離開環境」
管理內存
接觸引用:數據不在用,能夠將其值設置爲null,用於全局變量和對象,局部的離開執行環境會被自動解除引用。
注意:解除引用不等於回收該值所佔內存,仍是須要等待垃圾收集器
碼字不易,有用的話點個贊鴨!