JavaScript學習筆記(語法部分)

基礎語法部分

語句和表達式

語句(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_VALUENumber.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。


數據類型轉換

強制轉換主要指使用NumberStringBoolean三個構造函數,手動將各種類型的值,轉換成數字、字符串或者布爾值。

使用Number函數,可以將任意類型的值轉化成數值。對于原始類型(字符串、布爾值、undefined和null),它們都能被Number轉成數值或NaN。對于復雜類型,默認情況下,會返回NaN。

使用Boolean函數,可以將任意類型的變量轉為布爾值。除了undefinednullNaN,0,±0以及空字符串會返回false之外,其余的都返回true。


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容