基礎語法部分
語句和表達式
語句(statement)
是為了完成某種任務而進行的操作,通常以分號結尾,一個分號就表示一個語句結束。
表達式(expression)
,指一個為了得到返回值的計算式,不需要分號結尾。
兩者的區別在于,語句主要為了進行某種操作,一般情況下不需要返回值;表達式則是為了得到返回值,一定會返回一個值。
變量
量是對“值”的引用,使用變量等同于引用一個值。
JavaScript引擎的工作方式是,先解析代碼,獲取所有被聲明的變量,然后再一行一行地運行。這造成的結果,就是所有的變量的聲明語句,都會被提升到代碼的頭部,這就叫做變量提升(hoisting)。
Note
:變量提升只對var命令聲明的變量有效。
區塊
JavaScript使用大括號,將多個相關的語句組合在一起,稱為“區塊”(block),區塊不構成單獨的作用域(scope)。也就是說,區塊中的變量與區塊外的變量,屬于同一個作用域。
因此,單獨使用的區塊意義不大,區塊往往用來構成例如如for、if、while等其他更復雜的語法結構。
數據類型
JavaScript的數據類型可以分為以下幾種:
- 基本類型
1、 數值(number)
2、 字符串(string)
3、 布爾值(boolean) - 復雜類型
4、 對象(object)
5、 數組(array)
6、 函數(function) - 特殊類型
7、 undefined
8、 null
typeof運算符
typeof運算符可以返回一個值的數據類型,可以用來檢查一個沒有聲明的變量,而不報錯:
if (typeof a === "undefined") {
.....
}
null與undefined
null表示空值,即該處的值現在為空,例如函數傳參。
undefined表示“未定義”。
布爾值轉換
undefined、null、false、0、NaN以及空字符會被自動轉為布爾值false,其余值包括空數組和空對象都會轉換為true。
數值
JavaScript內部,所有數字都是以64位浮點數形式儲存,即使整數也是如此。
Number.MAX_VALUE
與Number.MIN_VALUE
表示了最大值和最小值。
NaN是JavaScript的特殊值,表示“非數字”(Not a Number),主要出現在將字符串解析成數字出錯的場合。它不等于任何值,包括它本身。可以通過isNaN
函數來判斷變量是否是NaN(最好先判斷一下變量類型),也可以利用NaN!=NaN的特性來判斷:
function IsNaN(value) {
return value !== value;
}
字符串
字符串可以被視為字符數組,但是無法改變字符串之中的單個字符。同樣,字符串也無法直接使用數組的方法,必須通過call方法間接使用。在JavaScript引擎內部,所有字符都用Unicode表示,每個字符在JavaScript內部都是以16位的UTF-16格式儲存。
Base64
Base64是一種編碼方法,可以將任意字符轉成可打印字符。使用這種編碼方法,主要不是為了加密,而是為了不出現特殊字符,簡化程序的處理。
JavaScript提供了用于Base64轉碼ASCII字符串的相關方法:
btoa():字符串或二進制值轉為Base64編碼
atob():Base64編碼轉為原來的編碼
而對于非ASCII編碼的字符串,必須中間插入一個轉碼環節:
function b64Encode(str) {
return btoa(encodeURIComponent(str));
}
function b64Decode(str) {
return decodeURIComponent(atob(str));
}
對象
JavaScript的所有數據都可以被視為對象。創建對象的方法可以分為三種:
var o1 = {};
var o2 = new Object();
var o3 = Object.create(null);
對象的所有鍵名都是字符串,JavaScript規定,如果行首是大括號,一律解釋為語句(即代碼塊)。如果要解釋為表達式(即對象),必須在大括號前加上圓括號。
數組
在JavaScript中,任何類型都可以被放進數組。而本質上,數組是一種特殊的對象,因此,使用typeof
運算符獲得的結果仍是object
,其特殊性體現在,它的鍵名是按次序排列的一組整數,而且在取鍵值時候同樣轉換為字符串。
數組的length屬性,返回數組的成員數量,它是一個動態的值,因為數組的key不需要連續,所以length值等于鍵名中的最大整數加上1。
length屬性是可寫的。如果人為設置一個小于當前成員個數的值,該數組的成員會自動減少到length設置的值。將數組清空的一個有效方法,就是將length屬性設為0。
值得注意的是,由于數組本質上是對象的一種,所以我們可以為數組添加屬性,但是這不影響length屬性的值。
檢查某個鍵名是否存在的運算符in
,適用于對象,也適用于數組。如果鍵名處是空位,則返回false。
for...in
循環不僅可以遍歷對象,也可以遍歷數組,畢竟數組只是一種特殊對象.
Note:
但是,for...in
不僅會遍歷數組所有的數字鍵,還會遍歷非數字鍵,因此更推薦使用for
來遍歷數組。
當數組的某個位置是空元素,即兩個逗號之間沒有任何值,我們稱該數組存在空位,對其讀取的返回值為undefined
。length屬性不過濾空位,因此,使用for
進行數組遍歷,要注意處理。
如果是空位,使用數組的forEach方法、for...in結構、以及Object.keys方法進行遍歷,空位都會被跳過。但如果某個位置是undefined,遍歷的時候就不會被跳過。
函數
在JavaScript中,函數也是一種對象。它的length
屬性返回函數預期傳入的參數個數,即函數定義之中的參數個數。
Javascript只有兩種作用域:一種是全局作用域,變量在整個程序中一直存在,所有地方都可以讀取;另一種是函數作用域,變量只在函數內部存在。
函數本身也是一個值,也有自己的作用域。它的作用域與變量一樣,就是其聲明時所在的作用域,與其運行時所在的作用域無關。
函數參數如果是原始類型的值(數值、字符串、布爾值),傳遞方式是傳值傳遞;如果函數參數是復合類型的值(數組、對象、其他函數),傳遞方式是傳址傳遞。
JavaScript通過arguments
對象來為函數提供不定數目的參數,該對象包含了函數運行時的所有參數。通過arguments對象的length屬性,可以判斷函數調用時到底帶幾個參數。
arguments
對象并不是一個數組,數組專有的方法不能在arguments對象上直接使用。而是通過apply
函數或者將它轉化為數組來使用。
arguments
對象帶有一個callee屬性,返回它所對應的原函數,可以通過arguments.callee
,達到調用函數自身的目的。
閉包就是定義在函數內部的函數,即能夠讀取其他函數內部變量的函數。在本質上,閉包就是將函數內部和函數外部連接起來的一座橋梁,最大的特點,就是它可以“記住”誕生的環境。
閉包的最大用處有兩個,一個是可以讀取函數內部的變量,另一個就是讓這些變量始終保持在內存中,即閉包可以使得它誕生環境一直存在,因此,閉包可以封裝對象的私有屬性和私有方法。
note:
外層函數每次運行,都會生成一個新的閉包,而這個閉包又會保留外層函數的內部變量,所以內存消耗很大。
運算符
加法運算符可以完成兩種運算,既可以處理算術的加法,也可以用作字符串連接。如果運算子是對象,先自動轉成原始類型的值。只要有一個運算子是字符串,則兩個運算子都轉為字符串,執行字符串連接運算。否則,兩個運算子都轉為數值,執行加法運算。
相等運算符==
比較兩個值是否相等,嚴格相等運算符===
比較它們是否為“同一個值”。
如果兩個值不是同一類型,嚴格相等運算符===
直接返回false,而相等運算符==
會將它們轉化成同一個類型,再用嚴格相等運算符進行比較。
對于嚴格相等運算符:
- 兩個值的類型不同,直接返回false.
- 同一類型的原始類型的值,相同就返回true,否則返回false。
- 復合類型的數據比較時,不是比較它們的值是否相等,而是比較它們是否指向同一個對象。
對于相等運算符:
- 原始類型的數據會轉換成數值類型再進行比較
- 對象與原始類型的值比較時,對象轉化成原始類型的值,再進行比較。
- undefined和null與其他類型的值比較時,結果都為false,它們互相比較時結果為true。
取反運算符有轉換數據類型的作用,!!x 等同于Boolean(x).
左移運算符<<
表示將一個數的二進制值向左移動指定的位數,尾部補0,即乘以2的指定次方(最高位即符號位不參與移動)。
右移運算符>>
表示將一個數的二進制值向右移動指定的位數,頭部補0,即除以2的指定次方(最高位即符號位不參與移動)。
帶符號位的右移運算符>>>
表示將一個數的二進制形式向右移動,包括符號位也參與移動,頭部補0。
void運算符的作用是執行一個表達式,然后不返回任何值,或者說返回undefined。
數據類型轉換
強制轉換主要指使用Number
、String
和Boolean
三個構造函數,手動將各種類型的值,轉換成數字、字符串或者布爾值。
使用Number
函數,可以將任意類型的值轉化成數值。對于原始類型(字符串、布爾值、undefined和null),它們都能被Number轉成數值或NaN。對于復雜類型,默認情況下,會返回NaN。
使用Boolean函數,可以將任意類型的變量轉為布爾值。除了undefined
,null
,NaN
,0
,±0
以及空字符串會返回false之外,其余的都返回true。