JavaScript 教程學習筆記2-基本語法

1.語句

JavaScript 程序的執行單位爲行(line),也就是一行一行地執行。一般情況下,每一行就是一個語句。

語句(statement)是爲了完成某種任務而進行的操作,比如下面就是一行賦值語句。

var a = 1 + 3;

先用var命令,聲明瞭變量a,然後將1 + 3的運算結果賦值給變量a
1 + 3叫做表達式(expression),指一個爲了得到返回值的計算式。

語句和表達式的區別:

  • 語句主要爲了進行某種操作,一般情況下不需要返回值;
  • 表達式則是爲了得到返回值,一定會返回一個值。
    語句以分號結尾,一個分號就表示一個語句結束。多個語句可以寫在一行內。
var a = 1 + 3 ; var b = 'abc';

分號前面可以沒有任何內容,JavaScript 引擎將其視爲空語句。

;;;

2.變量

2.1 概念

變量是對“值”的具名引用。變量就是爲“值”起名,然後引用這個名字,就等同於引用這個值。變量的名字就是變量名。

var a = 1;

上面的代碼先聲明變量a,然後在變量a與數值1之間建立引用關係,稱爲將數值1“賦值”給變量a。以後,引用變量名a就會得到數值1。最前面的var,是變量聲明命令。它表示通知解釋引擎,要創建一個變量a
注意,JavaScript 的變量名區分大小寫,Aa是兩個不同的變量。
如果只是聲明變量而沒有賦值,則該變量的值是undefinedundefined是一個特殊的值,表示“無定義”。

var a;
a // undefined

如果變量賦值的時候,忘了寫var命令,這條語句也是有效的。

var a = 1;
// 基本等同
a = 1;

但是,不寫var的做法,不利於表達意圖,而且容易不知不覺地創建全局變量,所以建議總是使用var命令聲明變量

如果一個變量沒有聲明就直接使用,JavaScript 會報錯,告訴你變量未定義。

x
// ReferenceError: x is not defined

JavaScript 是一種動態類型語言,也就是說,變量的類型沒有限制,變量可以隨時更改類型。

var a = 1;
a = 'hello';

如果使用var重新聲明一個已經存在的變量,是無效的。

var x = 1;
var x;
x // 1

但是,如果第二次聲明的時候還進行了賦值,則會覆蓋掉前面的值。

var x = 1;
var x = 2;
// 等同於
var x = 1;
var x;			// 無效的變量定義
x = 2;

2.2 變量提升

JavaScript 引擎的工作方式是,先解析代碼,獲取所有被聲明的變量,然後再一行一行地運行。這造成的結果,就是所有的變量的聲明語句,都會被提升到代碼的頭部,這就叫做變量提升(hoisting)。

console.log(a);
var a = 1;

上面代碼首先使用console.log方法,在控制檯(console)顯示變量a的值。這時變量a還沒有聲明和賦值,所以這是一種錯誤的做法,但是實際上不會報錯。因爲存在變量提升,真正運行的是下面的代碼。

var a;
console.log(a);
a = 1;

最後的結果是顯示undefined,表示變量a已聲明,但還未賦值。

3.標識符

標識符(identifier)指的是用來識別各種值的合法名稱。最常見的標識符:變量名,函數名。JavaScript 語言的標識符對大小寫敏感,所以aA是兩個不同的標識符。

簡單說,標識符命名規則如下:

  • 第一個字符,可以是任意 Unicode
    字母(包括英文字母和其他語言的字母),以及美元符號($)和下劃線(_)。如:_tmp、$elem、π。
  • 第二個字符及後面的字符,除了 Unicode 字母、美元符號和下劃線,還可以用數字0-9。如:arg0。

下面這些則是不合法的標識符。

	1a  // 第一個字符不能是數字
	23  // 同上
	***  // 標識符不能包含星號
	a+b  // 標識符不能包含加號
	-d  // 標識符不能包含減號或連詞線

中文是合法的標識符,可以用作變量名。

var 臨時變量 = 1;

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。

4.註釋

源碼中被 JavaScript 引擎忽略的部分就叫做註釋,它的作用是對代碼進行解釋。
註釋的寫法:

  • 單行註釋,用//起頭;由於歷史上 JavaScript 可以兼容 HTML 代碼的註釋,所以也被視爲合法的單行註釋;
  • 多行註釋,放在//之間。
// 這是單行註釋

/*
 這是
 多行
 註釋
*/

x = 1; <!-- x = 2;
--> x = 3;

5.區塊

JavaScript 使用大括號將多個相關的語句組合在一起,稱爲“區塊”(block)。

對於var命令來說,JavaScript 的區塊不構成單獨的作用域(scope)。

{
  var a = 1;
}

a // 1

單獨使用區塊並不常見,區塊往往用來構成其他更復雜的語法結構,比如forifwhilefunction等。

6.條件語句

6.1 if 結構

if…else 結構

switch 結構

多個if…else連在一起使用的時候,可以轉爲使用更方便的switch結構。

// switch語句部分和case語句部分,都可以使用表達式。
// 且switch和case中的表達式比較運行結果時,採用嚴格相等運算符(===),這意味着比較時不會發生類型轉換。
switch (fruit) {
  case "banana":
  case "peach":
    // ...
    break;		// break語句不能少,否則會接下去執行下一個case代碼塊,而不是跳出switch結構。
  case "apple":
    // ...
    break;
  default:
    // ...
}

6.4三元運算符 ?:

(條件) ? 表達式1 : 表達式2

7.循環語句

循環語句用於重複執行某個操作,它有多種形式。

7.1 while 循環

While語句包括一個循環條件和一段代碼塊,只要條件爲真,就不斷循環執行代碼塊。

// 條件是一個表達式,必須放在圓括號中
while (條件)
  語句;

// 或者
while (條件) 語句;
// 或者
while (條件) {
  語句;
}
var i = 0;
while (i < 100) {
  console.log('i 當前爲:' + i);
  i = i + 1;
}

7.2 for 循環

注意:初始化表達式需要var或者let(ES6)定義,各表達式之間用分號分隔

var x = 3;
for (var i = 0; i < x; i++) {
  console.log(i);
}

// 或者
var i = 0;
for (; i < x; i++) {
  console.log(i);
}
// 0
// 1
// 2

所有for循環,都可以改寫成while循環。上面的例子改爲while循環,代碼如下。

var x = 3;
var i = 0;

while (i < x) {
  console.log(i);
  i++;
}

7.3 do…while 循環

do...while循環與while循環類似,唯一的區別就是先運行一次循環體,然後判斷循環條件

do {
  語句
} while (條件);

不管條件是否爲真,do…while循環至少運行一次,這是這種結構最大的特點。另外,while語句後面的分號注意不要省略。

var x = 3;
var i = 0;

do {
  console.log(i);
  i++;
} while(i < x);
// 0
// 1
// 2

7.4 break 語句和 continue 語句

break語句和continue語句都具有跳轉作用,可以讓代碼不按既有的順序執行。

  • break語句用於跳出代碼塊或循環,所有的循環立即結束。
  • continue語句用於立即終止本輪循環,返回循環結構的頭部,開始下一輪循環。

如果存在多重循環,不帶參數的break語句和continue語句都只針對最內層循環

7.5 標籤(label)

JavaScript 語言允許,語句的前面有標籤(label),相當於定位符,用於跳轉到程序的任意位置,標籤的格式如下。

label:
  語句

標籤可以是任意的標識符,但不能是保留字,語句部分可以是任意語句。
標籤通常與break語句和continue語句配合使用,跳出特定的循環。

top:
  for (var i = 0; i < 3; i++){
    for (var j = 0; j < 3; j++){
    	// i === 1 && j === 1 時跳出雙層循環,否則默認只會跳出內層循環,進入下一次的外層循環。
      if (i === 1 && j === 1) break top;
      console.log('i=' + i + ', j=' + j);
    }
  }
// i=0, j=0
// i=0, j=1
// i=0, j=2
// i=1, j=0

標籤也可以用於跳出代碼塊。

foo: {
  console.log(1);
  break foo;
  console.log('本行不會輸出');
}
console.log(2);
// 1
// 2

上面代碼執行到break foo,就會跳出區塊。

continue語句也可以與標籤配合使用。

top:
  for (var i = 0; i < 3; i++){
    for (var j = 0; j < 3; j++){
    	
      if (i === 1 && j === 1) continue top;
      console.log('i=' + i + ', j=' + j);
    }
  }
// i=0, j=0
// i=0, j=1
// i=0, j=2
// i=1, j=0
// i=2, j=0
// i=2, j=1
// i=2, j=2

本文爲阮一峯老師的《JavaScript 教程》學習筆記,多數文字和示例來源於此書

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章