ES核心語法(1)
ES核心語法(1)
目錄識別符號命名規則
在JavaScript中無論是變數還是函式,又或者是class的類,在命名的時候都需要遵守識別符號的命名規則。
識別符號的命名規則如下:
- 第一個字元,可以是任意
Unicode
字母(包括英文字母和其他語言的字母),以及美元符號($
)和下劃線(_
)。 - 第二個字元及後面的字元,除了
Unicode
字母、美元符號和下劃線,還可以用數字0-9。
JavaScript中還有一些保留字,不能用作識別符號。
如下:
JavaScript 有一些保留字,不能用作識別符號: arguments、break、case、catch、class、const、continue、debugger、 default、delete、do、else、enum、eval、export、extends、false、finally、 for、function、if、implements、import、in、instanceof、interface、let、 new、null、package、private、protected、public、return、static、super、 switch、this、throw、true、try、typeof、var、void、while、with、yield。
變數
定義
在JavaScript中,變數被稱為臨時儲存資料的容器
。
宣告變數
宣告變數可以通過var
關鍵字來宣告。
var 變數名;
變數的命名需要遵守識別符號的命名規則,可以參考上面的一個小節。
一般來說,通過var
關鍵字建立了一個變數可以說是聲明瞭一個變數。而第一次給變數賦值可以稱為是變數的初始化。
var a = 10;
上面程式碼相當於是聲明瞭一個變數並且將其值初始化為10。
宣告變數的時候,可以同時宣告多個變數。
var a = 10, b = 20;
變數名可以使用中文。例如:
var 姓名 = '張三';
在宣告變數的時候,如果沒有使用關鍵字來進行宣告,相當於是創建出一個全域性變數,例如:
a = 100;
上面沒有通過關鍵字var 聲明瞭一個變數,並且進行了初始化操作,但是這樣的寫法是不推薦的。容易造成變數汙染。
重新賦值和重新宣告
JavaScript是動態型別語言,所以變數的型別可以根據程式的變化而改變。
例如:
var a = 100; // 變數a是一個number型別
a = 'hello,world'; // 將字串重新賦值給變數a,這個時候變數a的型別就變成了字串型別
當一個變數宣告並且初始化之後,在js中允許重新進行宣告和賦值。
例如:
var a = 100;
var a = 'hello,world';
需要注意的是,如果變數重新宣告但是沒有進行重新賦值,並不會影響之前的值。
var a = 100;
var b;
console.log(a); // 100
變數提升
宿主環境在正式的執行程式碼之前,會先進行預解析操作,把所有的變數宣告語句(注意,並不包括賦值操作)提升到當前所在作用域的最頂端。
這樣就出現了可以在變數宣告語句前使用變數的現象。
console.log(a); // undefined
var a = 100;
當一個變數宣告但是沒有初始化的時候,這個變數的值就是undefined。
表示式和語句
語句是為了完成某種目的而進行的操作,例如常見的賦值語句:
var s = 'hello,world';
而表示式是指為了得到返回值的計算式。例如:
100 + 100;
語句和表示式的區別在於,前者主要為了進行某種操作,一般情況下不需要返回值;後者則是為了得到返回值,一定會返回一個值。凡是 JavaScript 語言中預期為值的地方,都可以使用表示式。比如,賦值語句的等號右邊,預期是一個值,因此可以放置各種表示式。
語句應該在每一句的後面新增上語句結束符,表示語句的結束,多條語句可以放在一行。
表示式則不需要加語句結束符,如果加了的話,JavaScript引擎會把表示式理解為語句。
資料型別
在JavaScript中,資料型別可以分成兩大類:
- 基礎資料型別
- 引用資料型別
基礎資料型別包括:
- Number
- String
- Boolean
- Null
- Undefined
引用資料型別包括:
- Array
- Function
- Object
基礎資料型別和引用資料型別的區別
基礎資料型別和引用資料型別在記憶體中儲存的時候存在一定的區別:
- 基礎資料型別資料儲存在記憶體的棧當中,因為棧的空間並不會隨著使用而發生改變,所以基礎資料型別的值是不可以更改的。同時將一個基礎資料型別的值賦值給另外一個變數,相當於是將這個值拷貝了一份賦值給了另外一個變數。
- 引用資料型別在記憶體中,會把資料儲存在堆當中,因為堆會根據資料的大小自動分配空間,所以引用資料型別是可以進行值的更改的。並且,引用資料型別會把資料存在堆當中的記憶體地址儲存到棧當中,當一個變數中儲存了一個引用資料型別的時候,並且把這個變數同時賦值給另外一個變數,相當於是二者共享了一個記憶體地址,也就意味著一個變數更改了物件的值,另外一個變數儲存的資料也會受到影響。
String 字串型別
JavaScript中,建立一個字串非常簡單,只需要通過單引號或者雙引號即可建立。
例如:
var str1 = '字串1';
var str2 = "字串2";
在使用字串的時候需要注意,不能在單引號中重複使用單引號,不能在雙引號中重複使用雙引號。因為JavaScript引擎會理解錯誤。
如下:
var str = '張三說:"你吃飯了嗎"'; // 單引號當中可以使用雙引號。雙引號當中可以使用單引號
雖然建立字串既可以使用單引號也可以使用雙引號,但是需要注意的是,為了保證程式碼風格的一致性,最好在專案中統一規則,要麼全部使用單引號,要麼全部使用雙引號。
兩個字串之間可以使用+
加號進行字串的拼接,例如:
var a = 'hello';
var b = 'world';
console.log(a + ',' + b); // hello,world
Number 數字型別
在別的語言當中,會把數字分為整型
和浮點型
。但是在JavaScript
中,不管是整型還是浮點型,統稱為數字型別。
例如:
var n = 100;
var y = 200;
在JavaScript內部,所有的數字都是以64位浮點數的形式儲存,即使整數也是如此,所以,在JavaScript中,1
和1.0
是相同的,是同一個數。
例如:
1 === 1.0
又因為某些情況下需要整數參與運算,所以JavaScript會自動把64位的浮點數轉成32位的整數,然後再進行運算。
因為浮點數不是精確的值,所以在使用的時候,需要格外注意:
0.1 + 0.2 === 0.3
// false
0.3 / 0.1
// 2.9999999999999996
(0.3 - 0.2) === (0.2 - 0.1)
// false
在Number型別當中,存在幾個特殊值:
- NaN
- +0 和 -0
- Infinity
在數字型別當中存在一個非常特殊的存在:NaN(Not a Number)
。NaN
不和任何值相等,也不和自己相等。同時,任何的資料型別和它進行運算的結果都是NaN
。
在絕大多數情況下,+0
和-0
都是等價的,但是,當+0
或者-0
當作分母時,就會出現不一樣的返回值。
(1 / +0) === (1 / -0) // false
上面的程式碼之所以出現這樣結果,是因為除以正零得到+Infinity,除以負零得到-Infinity,這兩者是不相等的。
Infinity
表示無窮。
用來表示兩種場景。一種是一個正的數值太大,或一個負的數值太小,無法表示;另一種是非0數值除以0,得到Infinity。
// 場景一
Math.pow(2, 1024)
// Infinity
// 場景二
0 / 0 // NaN
1 / 0 // Infinity
由於數值正向溢位(overflow)、負向溢位(underflow)和被0除,JavaScript 都不報錯,所以單純的數學運算幾乎沒有可能丟擲錯誤。
Infinity大於一切數值(除了NaN),-Infinity小於一切數值(除了NaN)。
Infinity的計算規則:
- Infinity的四則運算,符合無窮的數學計算規則。
5 * Infinity // Infinity
5 - Infinity // -Infinity
Infinity / 5 // Infinity
5 / Infinity // 0
- 0乘以Infinity,返回NaN;0除以Infinity,返回0;Infinity除以0,返回Infinity。
0 * Infinity // NaN
0 / Infinity // 0
Infinity / 0 // Infinity
- Infinity加上或乘以Infinity,返回的還是Infinity。
Infinity + Infinity // Infinity
Infinity * Infinity // Infinity
- Infinity減去或除以Infinity,得到NaN。
Infinity - Infinity // NaN
Infinity / Infinity // NaN
- Infinity與null計算時,null會轉成0,等同於與0的計算。
null * Infinity // NaN
null / Infinity // 0
Infinity / null // Infinity
- Infinity與undefined計算,返回的都是NaN。
undefined + Infinity // NaN
undefined - Infinity // NaN
undefined * Infinity // NaN
undefined / Infinity // NaN
Infinity / undefined // NaN
Boolean 布林值
布林值表示真
和假
的兩個狀態。真
時用true
表示,假
時用false表示。布林值型別只有這兩個值。
Null 和 Undefined
Null
和Undefined
型別各自都有一個值:null
和undefined
。
JavaScript初期時,只有一個null
,後來Brendan Eich
覺得並不足夠,於是就新增了一個undefined
。
二者區別是這樣的:null是一個表示“空”的物件,轉為數值時為0;undefined是一個表示"此處無定義"的原始值,轉為數值時為NaN。
需要注意的是,在通過==
和===
進行比較的時候,null
和undefined
在==
時結果為true,===
時結果為false
。
null表示空值,即該處的值現在為空。呼叫函式時,某個引數未設定任何值,這時就可以傳入null,表示該引數為空。比如,某個函式接受引擎丟擲的錯誤作為引數,如果執行過程中未出錯,那麼這個引數就會傳入null,表示未發生錯誤。
undefined表示“未定義”,下面是返回undefined的典型場景。
// 變數聲明瞭,但沒有賦值
var i;
i // undefined
// 呼叫函式時,應該提供的引數沒有提供,該引數等於 undefined
function f(x) {
return x;
}
f() // undefined
// 物件沒有賦值的屬性
var o = new Object();
o.p // undefined
// 函式沒有返回值時,預設返回 undefined
function f() {}
f() // undefined