變量
JavaScript 中有八種基本的數據類型(譯注:前七種為基本數據類型,也稱為原始類型,而 object
為復雜數據類型)。
number
用於任何類型的數字:整數或浮點數,在±(253-1)
范圍內的整數。bigint
用於任意長度的整數。string
用於字符串:一個字符串可以包含 0 個或多個字符,所以沒有單獨的單字符類型。boolean
用於true
和false
。null
用於未知的值 —— 只有一個null
值的獨立類型。undefined
用於未定義的值 —— 只有一個undefined
值的獨立類型。symbol
用於唯一的標識符。object
用於更復雜的數據結構。
我們可以通過 typeof
運算符查看存儲在變量中的數據類型。
- 兩種形式:
typeof x
或者typeof(x)
。 - 以字符串的形式返回類型名稱,例如
"string"
。 typeof null
會返回"object"
—— 這是 JavaScript 編程語言的一個錯誤,實際上不是一個object
。
交互:alert、prompt、confirm
alert
顯示信息。
prompt
顯示信息要求用戶輸入文本。點擊確定返回文本,點擊取消或按下 Esc 鍵返回 null
。
confirm
顯示信息等待用戶點擊確定或取消。點擊確定返回 true
,點擊取消或按下 Esc 鍵返回 false
。
類型轉換
有三種常用的類型轉換:轉換為 string 類型、轉換為 number 類型和轉換為 boolean 類型。
字符串轉換 —— 轉換發生在輸出內容的時候,也可以通過 String(value)
進行顯式轉換。原始類型值的 string 類型轉換通常是很明顯的。
數字型轉換 —— 轉換發生在進行算術操作時,也可以通過 Number(value)
進行顯式轉換。
數字型轉換遵循以下規則:
值 | 變成…… |
---|---|
undefined |
NaN |
null |
0 |
true / false |
1 / 0 |
string |
“按原樣讀取”字符串,兩端的空白會被忽略。空字符串變成 0 。轉換出錯則輸出 NaN 。 |
布爾型轉換 —— 轉換發生在進行邏輯操作時,也可以通過 Boolean(value)
進行顯式轉換。
布爾型轉換遵循以下規則:
值 | 變成…… |
---|---|
0 , null , undefined , NaN , "" |
false |
其他值 | true |
上述的大多數規則都容易理解和記憶。人們通常會犯錯誤的值得注意的例子有以下幾個:
- 對
undefined
進行數字型轉換時,輸出結果為NaN
,而非0
。 - 對
"0"
和只有空格的字符串(比如:" "
)進行布爾型轉換時,輸出結果為true
。
基礎運算符,數學
數學
- 加法
+
, - 減法
-
, - 乘法
*
, - 除法
/
, - 取余
%
, - 求冪
**
(求冪運算a ** b
是a
乘以自身b
次。適用於非整數)
+
運算符
- 作為二元運算符用於鏈接自負床
- 作為一元運算符用於將運算元轉化位數字
賦值運算符=
- 語句
x = value
將值value
寫入x
然后返回 x。
原地修改
- 所有算術和位運算符都有簡短的“修改並賦值”運算符:
/=
和-=
等。這類運算符的優先級與普通賦值運算符的優先級相同,所以它們在大多數其他運算之后執行
自增/自減
運算符 ++
和 --
可以置於變量前,也可以置於變量后。
- 當運算符置於變量后,被稱為“后置形式”:
counter++
。 - 當運算符置於變量前,被稱為“前置形式”:
++counter
。 - 如果自增/自減的值不會被使用,那么兩者形式沒有區別
- 如果我們想要對變量進行自增操作,並且 需要立刻使用自增后的值,那么我們需要使用前置形式
- 如果我們想要將一個數加一,但是我們想使用其自增之前的值,那么我們需要使用后置形式
位運算符
- 按位與 (
&
) - 按位或 (
|
) - 按位異或 (
^
) - 按位非 (
~
) - 左移 (
<<
) - 右移 (
>>
) - 無符號右移 (
>>>
)
參考 位操作符
逗號運算符
- 逗號運算符能讓我們處理多個語句,使用
,
將它們分開。每個語句都運行了,但是只有最后的語句的結果會被返回。 - 請注意逗號運算符的優先級非常低,比
=
還要低
值的比較
- 比較運算符始終返回布爾值。
- 字符串的比較,會按照“詞典”順序逐字符地比較大小。
- 當對不同類型的值進行比較時,它們會先被轉化為數字(不包括嚴格相等檢查)再進行比較。
- 在非嚴格相等
==
下,null
和undefined
相等且各自不等於任何其他的值。 - 在使用
>
或<
進行比較時,需要注意變量可能為null/undefined
的情況。比較好的方法是單獨檢查變量是否等於null/undefined
。
條件分支:if 和 '?'
略
邏輯運算符
||(或)
一個或運算 ||
的鏈,將返回第一個真值,如果不存在真值,就返回該鏈的最后一個值。
特殊用法
-
獲取變量列表或者表達式中的第一個真值。
用或運算符選擇出有數據的那一個變量,如果都沒有,則在或運算的鏈最后放一個值作為結果。
-
短路求值(Short-circuit evaluation)。
||
對其參數進行處理,直到達到第一個真值,然后立即返回該值,而無需處理其他參數。利用這個特性,若操作數是一個有副作用的表達式則可以發揮作用。
&&(與)
與運算返回第一個假值,如果沒有假值就返回最后一個值。
💡與運算
&&
的優先級比或運算||
要高。
!(非)
邏輯非運算符接受一個參數,並按如下運作:
- 將操作數轉化為布爾類型:
true/false
。 - 返回相反的值。
兩個非運算 !!
有時候用來將某個值轉化為布爾類型,也可以使用內置的 Boolean
函數來轉化位布爾類型
空值合並運算符'??'
-
空值合並運算符
??
提供了一種從列表中選擇第一個“已定義的”值的簡便方式。它被用於為變量分配默認值:
// 當 height 的值為 null 或 undefined 時,將 height 的值設置為 100 height = height ?? 100;
-
??
運算符的優先級非常低,僅略高於?
和=
,因此在表達式中使用它時請考慮添加括號。 -
如果沒有明確添加括號,不能將其與
||
或&&
一起使用。
循環
通常使用 while(true)
來構造“無限”循環。這樣的循環和其他循環一樣,都可以通過 break
指令來終止。
如果我們不想在當前迭代中做任何事,並且想要轉移至下一次迭代,那么可以使用 continue
指令。
break/continue
支持循環前的標簽。標簽是 break/continue
跳出嵌套循環以轉到外部的唯一方法。
"switch"語句
switch
語句中判斷的條件是是否嚴格相等(===
)
函數
函數聲明方式如下所示:
function name(parameters, delimited, by, comma) {
/* code */
}
- 作為參數傳遞給函數的值,會被復制到函數的局部變量。
- 函數可以訪問外部變量。但它只能從內到外起作用。函數外部的代碼看不到函數內的局部變量。
- 函數可以返回值。如果沒有返回值,則其返回的結果是
undefined
。
為了使代碼簡潔易懂,建議在函數中主要使用局部變量和參數,而不是外部變量。
與不獲取參數但將修改外部變量作為副作用的函數相比,獲取參數、使用參數並返回結果的函數更容易理解。
函數命名:
- 函數名應該清楚地描述函數的功能。當我們在代碼中看到一個函數調用時,一個好的函數名能夠讓我們馬上知道這個函數的功能是什么,會返回什么。
- 一個函數是一個行為,所以函數名通常是動詞。
- 目前有許多優秀的函數名前綴,如
create…
、show…
、get…
、check…
等等。使用它們來提示函數的作用吧。
函數表達式
- 函數是值。它們可以在代碼的任何地方被分配,復制或聲明。
- 如果函數在主代碼流中被聲明為單獨的語句,則稱為“函數聲明”。
- 如果該函數是作為表達式的一部分創建的,則稱其“函數表達式”。
- 在執行代碼塊之前,內部算法會先處理函數聲明。所以函數聲明在其被聲明的代碼塊內的任何位置都是可見的。
- 函數表達式在執行流程到達時創建。
什么時候使用函數表達式:
例如:
嚴格模式下,當一個函數聲明在一個代碼塊內時,它在該代碼塊內的任何位置都是可見的。但在代碼塊外不可見。
如果需要依賴於代碼運行過程中產生的結果來聲明函數,函數可能在一個代碼塊中,此時其他部分的代碼將不能使用這個在代碼塊中聲明的函數。
這時可以使用函數表達式,將函數賦值給在代碼塊外聲明的變量
箭頭函數
- 不帶花括號:
(...args) => expression
— 右側是一個表達式:函數計算表達式並返回其結果。 - 帶花括號:
(...args) => { body }
— 花括號允許我們在函數中編寫多個語句,但是我們需要顯式地return
來返回一些內容。
原文地址:JavaScript 基礎知識