1. 程式人生 > >Javascript權威指南閱讀筆記--第3章類型、值和變量(1)

Javascript權威指南閱讀筆記--第3章類型、值和變量(1)

分享圖片 自動 局部變量 清理 ace defined define 原型 未在

  之前一直有個想法,好好讀完JS權威指南,便於自己對於JS有個較為全面的了解。畢竟本人非計算機專業出生,雖然做著相關行業的工作,但總覺得對於基礎的掌握並沒有相關專業學者紮實,正好因為辭職待業等原因,還是下定決心來好好讀一讀這本厚厚的‘詞典’。在閱讀原書過程中,本人也發現了不少概念問題,可能因為漢化區別,導致實際情況與概念描述並不相符的情況,這裏就全當做下筆記了。

  記錄從書籍第三章開始,如果有幸有人看到了本人博客並對前兩章有興趣,可以通過其它途徑去了解,這裏就當權威指南概念的縮減版,以及作為自己待業中激勵自己堅持下去的一種方式了。

3.類型、值和變量

  Javascript的數據類型分為兩類,原始類型(或基本類型),與對象類型(或引用類型)。

  其中,原型類型包括數字,字符串,布爾值以及兩個特殊的原始值nullundefined五類,對象類型就是常見的無序名值對{a:1,b:2},帶編號的有序集合--數組[1,2,3,4],以及函數function ab(){xx}了。

  對象是屬性的集合,每個屬性都由名/值構成,值可以是原始值,比如數字{a:1},字符串{a:‘nice‘}之類,也可以是對象[{a:1},{b:2}]。

  函數是具有與它相關聯的可執行代碼的對象,是類方法的封裝體,調用函數可運行執行代碼,並返回運算結果。

  如果函數使用new運算符來初始化一個新建對象,這裏稱之為構造函數,每個構造函數定義了由構造函數初始化的對象組成的合集。對於new運算符的使用,我們除了可以new一個數組,new一個函數之外,我們還可以new一個日期Date,new一個正則表達式RegExp以及錯誤類Error.

  垃圾回收站機制:js解釋器都有自己的內存管理機制,可以自動對內存進行及時釋放,當一個對象不被任何地方指引需要,解釋器就會自動釋放掉它,從而回收它所占用的內存資源。我們可以這樣理解,在快餐店吃飯時,負責清理桌子的阿姨總會即使清理掉客人剛離開的桌子,方便後面的客人繼續使用(內存釋放)。

  Javascript是一種面向對象語言,簡單點說,我們不需要定義全局函數去操作不同的值,而是數據本身去使用方法,例如數組a排序,我們不需要將a傳入到函數sort(),像這樣sort(a);而是直接使用a調用方法,像這樣a.sort(),在這裏,a.sort()就是sort(a)的面向對象版本。

  從技術上講,只有JS對象才能擁有方法,但是數字,字符串以及布爾值也能有自己的方法,比如字符串轉換,數組切割等等,在JS中只有null與undefined是沒有方法可以使用的值。

  我們在前面說,JS數據類型可以分為原始類型--字符串,數字,布爾,null,undefined和對象類型--函數,數組等,其實也可以分為擁有方法類型和不可擁有方法類型,上面說了,null和undefined是不可擁有方法,其余都可以;當然,我們還可以將數據分為可變類型和不可變類型,原型數據類型都不可變,對象類型可變,比如我們可以修改一個數組的長度,為它新增子元素等等。這裏我們會納悶,字符串不是也可以讀取長度,獲取以及替換字節嗎,其實對於字符串的方法而言,所有字符串的操作都是返回的新變量,並非有修改原字符串,如下:

var str = string,
    str1 = str.replace(s,S);
console.log(修改前為+str,修改後為+str1)

技術分享圖片

  可以看到,原字符串並未被修改,類似的數字也一樣,雖然有對應的方法,但這些方法並不是影響本身。

  JS變量是無類型的,直白點,變量可以被賦予任何類型的值,在賦予一個類型值後也可以任意修改為其它類型的值,比如我申明一個變量var a= 1,此時變量a的值類型為數字,我們緊接著使用a=‘str‘,那麽變量a的值類型由數字被替換成了字符串類型了。在JS中使用var來申明一個變量,在ES6中我們又知道了let以及常量申明const,這些後續再做描述。

  JS采用詞法作用域,變量分為全局變量局部變量。不在任何函數體內申明的變量稱之為全局變量,它在JS程序中的任意處都是可見可被調用的,例如:

console.log(num)
var num =1;

  輸出為undefined,並不會報錯,這裏就牽扯到了變量提升。正如我們前面說,var num並未在函數體內申明,沒有東西限制住它,雖然申明在了console後面,但是num是隨處可見的,其實它的身影在整個程序中都是可被調用的,只是說num的賦值是在console後,但是num申明卻可以被修改到任何位置,隨處可見,隨處可用。上面代碼等同於

var num;
console.log(num)
num =1;

  而局部變量就顯得比全局變量要矜持的多,在函數體內神明的變量,它始終只能在函數體內可見,函數外部是沒有權限訪問這個變量的。如下:

function num(){
    console.log(nummber)
    var nummber =1;
}
num();//undefined
console.log(nummber)//報錯

  可以這樣理解,函數num是一個小世界,變量number相對於函數num而言是可以任意調用的,但在函數體外,我們是無權直接訪問使用這個變量的。

  

  

 

Javascript權威指南閱讀筆記--第3章類型、值和變量(1)