Javascript權威指南閱讀筆記--第3章類型、值和變量(1)
之前一直有個想法,好好讀完JS權威指南,便於自己對於JS有個較為全面的了解。畢竟本人非計算機專業出生,雖然做著相關行業的工作,但總覺得對於基礎的掌握並沒有相關專業學者紮實,正好因為辭職待業等原因,還是下定決心來好好讀一讀這本厚厚的‘詞典’。在閱讀原書過程中,本人也發現了不少概念問題,可能因為漢化區別,導致實際情況與概念描述並不相符的情況,這裏就全當做下筆記了。
記錄從書籍第三章開始,如果有幸有人看到了本人博客並對前兩章有興趣,可以通過其它途徑去了解,這裏就當權威指南概念的縮減版,以及作為自己待業中激勵自己堅持下去的一種方式了。
3.類型、值和變量
Javascript的數據類型分為兩類,原始類型(或基本類型),與對象類型(或引用類型)。
其中,原型類型包括數字,字符串,布爾值以及兩個特殊的原始值null與undefined五類,對象類型就是常見的無序名值對{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)