一起學習JavaScript (4) 之變數、作用域和記憶體問題

w6a發表於2019-04-10

因為博主沒有系統的學習過前端基礎知識,所以打算讀一遍《JavaScript高階程式設計第三版》(以下簡稱“紅寶書”)。
為了更深刻地吸收知識,所以打算邊看邊記錄下知識點和一些自己的看法,並寫在這裡和大家一起探討探討~

紅寶書是一本很適合初級前端去看的書,第四版已經出了,然而因為窮(其實也因為不懂英文),還是選擇了第三版作為本次讀物。本讀書筆記按照書本的目錄順序進行記錄,書的前三章主要講的是 JavaScript 的起源簡介還有一些基本的概念,在這裡就先不贅述了,以後有機會一定補上。

第四章 變數、作用域和記憶體問題

基本型別和引用型別的值

  • 基本型別 (原始型別 / Primitive values)
    • String
    • Number
    • Boolean
    • null
    • undefined
  • 引用型別 (物件型別 / Reference values)

擴充:實際上在 ES6 中引入了一種新的原始型別 Symbol,表示獨一無二的值。是 JavaScript 語言的第七種資料型別。

在書中介紹,基本型別值指的是簡單的資料段,而引用型別值指那些可能由多個值構成的物件。

上述 String, Number, Boolean, null, undefined 這5種基本資料型別是按值訪問的,因為可以操作儲存在變數中的實際的值。

引用型別的值是儲存在記憶體中的物件,而 JavaScript 不允許直接訪問記憶體中的位置,也就是說不能直接操作物件的記憶體空間。在操作物件時,實際上是在操作物件的引用而不是實際的物件。因此,引用型別的值是按引用訪問的。

書中注:這種說法不嚴密,當複製儲存著物件的某個變數時,操作的是物件的引用。但在為物件新增屬性時,操作的是實際 的物件。——圖靈社群“壯壯的前端之路”注

動態的屬性

定義基本型別和引用型別的方式是類似的:建立一個變數併為該變數賦值。 但是,當這個值儲存到變數後,對不同型別值可以執行的操作則大相徑庭。對於引用型別的值,我們可以為其新增屬性和方法,也可以改變和刪除其屬性和方法。但我們不能給基本型別的值新增屬性,儘管這樣做不會導致任何錯誤。

var person = new Object();
person.name = 'Nick';
alert(person.name);     // 'Nick'
複製程式碼

以上程式碼建立了一個物件並將其儲存在了變數 person 中。然後,我們為該物件新增了一個名為 name 的屬性,並將字串 "Nick" 賦值給了這個屬性。緊接著,又通過 alert() 函式訪問了這個新屬性。如果物件不被銷燬或者刪除,這個屬性會一直存在。

var name = 'Nicky';
name.age = 12;
alert(name.age);     // undefined
複製程式碼

以上程式碼為字串 name 定義了一個名為 age 的屬性,並賦值為 12,但在下一行訪問這個屬性時發現返回的是 undefinded。這說明只能給引用型別動態地新增屬性,以便將來使用。


未完……

相關文章