表達式在JS中是短語,語句(statement)是JS的整句或命令。
諸如賦值和函數調用這些表達式,稱做爲表達式語句,還有聲明語句,條件語句等。
表達式語句
賦值語句是比較重要的表達式語句:
greeting = "Hello" + name;
i *= 1;
複合語句和空語句
可以用逗號運算符將幾個表達式連接在一起,形成一個表達式。還可以將多條語句聯合在一起,形成一條複合語句,只須用花括號將多條語句括起來即可。
{
x = Math.PI;
cx = Math.cos(x);
}
空語句
允許包含0條語句的語句,
;
聲明語句
var 和 function 都是聲明語句,它們聲明或定義變量或函數。
var
var 語句用來聲明一個或者多個變量。
關鍵字var之後跟隨的是要聲明的變量列表,列表中的每一個變量都帶有初始化表達式,用於指定它的初始值。例如:
var i ; //一個簡單的變量
var j = 0; //一個帶有初始值 的變量
var p,q; //兩個變量
var greeting = "hello" + name; //複雜的初始化表達式
var x = 2.34,y = Math.cos(0.75),r,theta; //很多變量
var x = 2, y = x*x; //第二個變量使用了第一個變量
//更多變量,每個變量佔一行
var x =2,
f = function(x) { return x*x },
y = f(x);
function
用來定義函數。格式如下:
function funcname([arg1 [,arg2 [...,argn]]]) {
statements
}
函數體用花括號括起來 {}。
簡單例子:
function hypotenuse(x,y) {
return Math.sqrt(x*x + y*y);
}
//遞歸函數
function factorial(n) {
if(n<1) return1;
return n*factorial(n-1);
}
條件語句
條件語句是通過判斷指定表達式的值來決定執行還是跳過某些語句。這些語句是代碼的‘決策點’,有時候稱爲‘分支’。
if
else if
代碼中有多條分支的時候使用else if
if(n == 1) {
//執行代碼塊1
}
else if(n == 2) {
//執行代碼塊2
}
else if(n == 3) {
//執行代碼塊3
}
else {
//之前的條件都爲false,則執行代這裏的代碼塊4
}
switch
switch(expression) {
statements
}
以下例子根據值的類型將該值轉換爲字符串:
function convert(x) {
switch (typeof x) {
case 'number':
return x.toString(16);
case 'string':
return '"' + x + '"';
default:
return String(x);
}
}
循環
while do/while for for/in
while
while也是一個基本的循環語句
while循環輸出0~9的值:
var count = 0;
while(count < 10) {
console.log(count);
count ++;
}
在這個例子中,變量count的初始值 是0,在循環執行過程中,它的值每次都遞增1。當循環執行了10次,表達式的值就變成了false.
do/while
它是在循環的尾部而不是頂部檢測循環表達式,這就意味着循環體至少執行一行。語法如下:
do
statement
while (expression);
function printArray(a) {
var len = a.length,i=0;
if(len == 0)
console.log("Empty Array");
else {
do{
console.log(i);
}while(++i < len);
}
}
for
for大部分都具有特定的計數器變量。計數器的三個關鍵操作是初始化,檢測和更新。
//語法結構
for (initialize; test ; increment)
statement
for循環的三個表達式任何一個都可以忽略。但是兩個分號必須要有。如果省略test,則會是個死循環。
for in
for(variable in object)
statement
for( var i = 0; i < a.length; i++){ //i代表了數組元素的索引
console.log(a[i]); //輸出數組中的每個元素
}
for(var p in o) {//將屬性名字賦值給變量p
console.log(o[p]);// 輸出每一個屬性的值
}
以上例子都是循環輸出,兩種書寫方式。
跳轉
break continue return throw
break 語句是跳轉到循環或者其他語句的執行並開始下一次循環的執行。
continue 語句是終止本次循環的執行並開始下一次 的循環。
return 語句讓解釋器跳出函數體的執行,並提供本次調用的返回值。
throw語句觸發或者拋出一個異常。
break
for( var i = 0; i < a.length; i++){ //i代表了數組元素的索引
if(a[i] == target) break();//如果找到了需要查找的數組元素,則使用break語句退出循環
}
continue
下面例子展示了 當一個錯誤的時候跳過當前循環的後續邏輯:
for( var i = 0; i < data.length; i++){
if(!data[i]) continue; //不能處理的undefined數據
total += data[i];
}
return
函數調用都是一種表達式,而所有的表達式都有值。函數中的return語句既是指定函數調用後 的返回值。
function square(x) {
return x*x; //一個包含return語句的函數
var a = square(2); // 4
}
throw
所謂異常是當發生了某種異常情況或錯誤時產生的一個信號
function factorial(x) {
//如果輸入參數是非法的,則拋出一個異常
if( x < 0) throw new Error ("x不能是負數")
};
//否則,計算出一個值,並正常地返回它
for (var f = 1; x > 1; f *= x, x--) /*empty*/;
return f;
try/catch/finally
try/catch/finally語句是 JS 的異常處理機制。
try從句定義了需要處理的異常所在的代碼塊。
catch從句跟隨在try從句之後,當try塊內的某處發生了異常時,調用catch內的代碼邏輯。
finally從句跟隨在catch之後,不管try塊中的是否產生異常,finally塊內的邏輯總會執行。
finally不是經常使用到。
代碼:
try{
//要求用戶輸入一個數字
var n = Number (prompt("請輸入一個正整數"," "));
//假設輸入是合法的,計算這個數的階乘
var f = factorial(n);
//顯示結果
alert( n + " != " + f);
}
catch(ex) {
//如果輸入不合法,將執行這裏的邏輯
alert(ex); //告訴用戶產生了什麼錯誤
}
with debugger use strict
with
with語句用於臨時擴展作用域鏈。
with (object)
statment
document.forms[0].address.value
with (document.forms[0]) {
//直接訪問表單的元素,例如
name.value = "";
address.value = "";
email.value = "";
}
debugger
這條語句用來產生一個斷點
use strict
使用use strict 指令的目的是說明後續 的代碼將會解析爲嚴格代碼
在嚴格模式中,給只讀屬性賦值和給不可擴展的對象創建新成員都將會拋出一個類型異常(這些在非嚴格模式中,只是操作失敗,不會報錯)
在嚴格模式中,傳入eval()的代碼不能在調用程序所在的上下文中聲明變量或定義函數
在嚴格模式中,函數裏的arguments對象擁有傳入函數值 的靜態副本。
在嚴格模式中,當delete運算符後跟隨非法的標識符(比如變量、函數、函數參數)時,將會拋出一個語法錯誤
在嚴格模式中,不允許使用八進制整數直接量
在嚴格模式中,標識符eval和arguments當做關鍵字,它們的值是不能更改的
在嚴格模式中,限制了對調用棧的檢測能力
JS語句小結: