一,分支結構
- 單一選擇結構(if)
- 二路選擇結構(if/else)
- 内聯三元運算符 ?:
- 多路選擇結構(switch)
1.1 if 控制語句
if-else基本格式:
if (表達式){
語句1;
......
}else{
語句2;
.....
}
功能說明
如果表達式的值為true則執行語句1,
否則執行語句2
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL5ATN4AzNxAjNx0SMxkTOxcDM5AzNxATM4EDMy0CMxQjNyITMvwFMxgTMwIzLcBTM0YjMyEzLcd2bsJ2Lc12bj5ycn9Gbi52YugTMwIzZtl2Lc9CX6MHc0RHaiojIsJye.png)
var x= (new Date()).getDay();
//擷取今天的星期值,0為星期天
var y;
if ( (x==6) || (x==0) ) {
y="周末";
}else{
y="工作日";
}
alert(y);
//等價于
y="工作日";
if ( (x==6) || (x==0) ) {
y="周末";
}
if 可以單獨使用
if語句嵌套格式
if (表達式1) {
語句1;
}else if (表達式2){
語句2;
}else if (表達式3){
語句3;
} else{
語句4;
}
示例:
if (x==1){
y="星期一";
}else if (x==2){
y="星期二";
...
}else if (x==6){
y="星期六";
}else if (x==0){
y="星期日";
}else{
y="未定義";
1.2 switch 選擇控制語句
switch基本格式:
switch (表達式) {
case 值1:語句1;break;
case 值2:語句2;break;
case 值3:語句3;break;
default:語句4;
}
switch(x){
case 1:y="星期一"; break;
case 2:y="星期二"; break;
case 3:y="星期三"; break;
case 4:y="星期四"; break;
case 5:y="星期五"; break;
case 6:y="星期六"; break;
case 7:y="星期日"; break;
default: y="未定義";
}
switch比else if結構更加簡潔清晰,使程式可讀性更強,效率更高。
switch為什麼效率高?
首先要看一個問題,if 語句适用範圍比較廣,隻要是 boolean 表達式都可以
用 if 判斷;而 switch 隻能對基本類型進行數值比較。兩者的可比性就僅限在
兩個基本類型比較的範圍内。
說到基本類型的數值比較,那當然要有兩個數。然後重點來了——
if 語句每一句都是獨立的,看下面的語句:
if (a == 1) ...
else if (a == 2) ...
這樣 a 要被讀入寄存器兩次,1 和 2 分别被讀入寄存器一次。于是你是否
發現其實 a 讀兩次是有點多餘的,在你全部比較完之前隻需要一次讀入寄存器
就行了,其餘都是額外開銷。但是 if 語句必須每次都把裡面的兩個數從記憶體拿
出來讀到寄存器,它不知道你其實比較的是同一個 a。
于是 switch case 就出來了,把上面的改成 switch case 版本:
switch (a) {
case 0:
break;
case 1:
}
總結:
1.switch用來根據一個整型值進行多路分支,并且編譯器可以對多路分支進行優化
2.switch-case隻将表達式計算一次,然後将表達式的值與每個case的值比較,進而
選 擇執行哪一個case的語句塊
3.if..else 的判斷條件範圍較廣,每條語句基本上獨立的,每次判斷時都要條件加
載一次。
是以在多路分支時用switch比if..else if .. else結構要效率高。
1.3 for循環控制語句
for循環基本格式:
for (初始化;條件;增量){
語句1;
...
}
功能說明:
實作條件循環,當條件成立時,執行語句1,否則跳出循環體
for (var i=1;i<=7;i++){
document.write("<H"+i+">hello</H "+i+"> ");
document.write("<br>");
}
----------------------------------------------
var arr=[1,"hello",true]//var dic={"1":"111"}
for (var i in arr){
console.log(i)
console.log(arr[i])
}
注意:
doms=document.getElementsByTagName("p");
for (var i in doms){
console.log(i); // 0 1 2 length item namedItem
//console.log(doms[i])
}
//循環的是你擷取的th一個DOM元素集,for in用來循環對象的所有屬性,
dom元素集包含了你上面輸出的屬性。
//如果你隻要循環dom對象的話,可以用for循環:
for (var i=0;i<doms.length;i++){
console.log(i) ; // 0 1 2
//console.log(doms[i])
}
1.4 while 循環控制語句
while循環基本格式:
while (條件){
語句1;
...
}
功能說明:
運作功能和for類似,當條件成立循環執行語句花括号{}内的語句,否則跳出循環
var i=1;
while (i<=7) {
document.write("<H"+i+">hello</H "+i+"> ");
document.write("<br>");
i++;
}
//循環輸出H1到H7的字型大小
<script language="JavaScript">
/* sayhello是定義的函數名,前面必須加上function和空格*/
function sayHello(){
var hellostr;
var myname=prompt("請問您貴姓?","苑");
hellostr="您好,"+myname+'先生,歡迎進入"探索之旅"!';
alert(hellostr);
document.write(hellostr);
}
//這裡是對前面定義的函數進行調用
sayHello();
</script>
1.5 異常處理
try {
//這段代碼從上往下運作,其中任何一個語句抛出異常該代碼塊就結束運作
}
catch (e) {
// 如果try代碼塊中抛出了異常,catch代碼塊中的代碼就會被執行。
//e是一個局部變量,用來指向Error對象或者其他抛出的對象
}
finally {
//無論try中代碼是否有異常抛出(甚至是try代碼塊中有return語句),finally代碼塊中始終會被執行。
}
var condition = true; if (condition) {
alert("我将出現!");
}
condition = false; if (condition) {
alert("我不會出現!");
} else {
alert("我會出現!");
}
condition ="some string"; if (condition) {
alert("可以直接對任何資料類型進行if判斷,在判斷時計算會自動将其轉換成布爾值!");
} var val = condition?"當為true時我将被傳回":"當為false時我将被傳回";
alert(val);//将輸出"當為true時我将被傳回"
對于if..else語句,如果要執行的語句隻有一條,可以不使用“{}”,但這種寫法并不推薦.但确實這樣可以簡化代碼:
var str="one";if (str=="one")alert("str的值為字元串‘one’";else alter("not one"))
雖然JavaScript中沒有if …. elseif 結構,但可以使用if…else的簡寫方式得到
//為了判斷使用者輸入的成績的範圍,我們使用了多重嵌套的if .. else語句
var num = window.prompt("請輸入XXX的成績!","");
num *=1;//window.prompt方法始終隻傳回字元串,用這樣的方法将其轉換成數字
if (isNaN(num) && num) {//不能将其它值轉換成數字時将傳回NaN,可以用内置的isNaN判斷值是否是NaN
alert("您輸入的不是一個數字!");
} else { if (num<=100 && num>=90) {
alert("Excellent!");
} else { if (num =80) {
alert("Good!");
} else { if (num < 80 && num >= 70) {
alert("So so!");
} else { if (num < 70 && num >=60) {
alert("Be careful !!!");
} else { if (num < 60 && num >= 0) {
alert("Oh, NO!");
} else {
alert("USB!");
}
}
}
}
}
} //上面的代碼由于用了多重的if..else嵌套,顯得非常的混亂,簡化隻須将else後的花括号去掉就行了
// if (...) {...}這算是一句
if (isNaN(num)) {
alert("您輸入的不是一個數字!");
} else if (num<=100 && num>=90) {
alert("Excellent!");
} else if (num =80) {
alert("Good!");
} else if (num < 80 && num >= 70) {
alert("So so!");
} else if (num < 70 && num >=60) {
alert("Be careful !!!");
} else if (num < 60 && num >= 0) {
alert("Oh, NO!");
} else {
alert("USB!");
} //看上去清晰多了,但要注意的是,JavaScript中沒有elseif 這樣的文法,是以上的else if之間是有空格的
用于進行多次判斷的switch語句
switch(condition) { //switch本來就是跳轉的意思(又稱為“開關”),是以switch語句就是判斷情況,跳到符合的情況開始執行
case 4:
alert("c的值是4"); case 3:
alert("c的值肯定大于等于3"); case 2:
alert("c的值肯定大于等于2"); case 1:
alert("c的值肯定大于等于1");
} //可以使用 break來隻執行符合一個條件的語句
switch(condition) { case 4:
alert("c的值是4"); break; case 3:
alert("c的值是3"); break; case 2:
alert("c的值是2"); break; case 1:
alert("c的值是1"); break;
} var condition="one"; switch(condition) {//switch不但可以用來判斷數字,還可以判斷字元串,甚至是不定的變量
case "one":
alert("condition的值是字元串'one' !"); break; case "three":
alert("condition的值是字元串'three' !"); break; case "four":
alert("condition的值是字元串'four' !"); break; case "five":
alert("condition的值是字元串'five' !"); break; default://當所有情況都不比對時,将執行default語句後的
alert("我們要萬無一失!condition什麼都不是!");
二,循環
循環用來指明當某些條件保持為真時要重複的動作。當條件得到滿足時,就跳出循環語句。在JavaScript中有四種循環結構可用。
- 由計數器控制的循環(for)
- 在循環的開頭測試表達式(while)
- 在循環的末尾測試表達式(do/while)
- 對對象的每個屬性都進行操作(for/in)
for 語句指定了一個計數器變量,一個測試條件,以及更新該計數器的操作。在每次循環的重複之前,都将測試該條件。如果測試成功,将運作循環中的代碼。如果測試不成功,不運作循環中的代碼,程式繼續運作緊跟在循環後的第一行代碼。在執行該循環後,計算機變量将在下一次循環之前被更新。
for (var i=0;i<10;i++) {//for循環的圓括号裡面須放三個句子,
//分别是1.初使化計數器 2.判斷條件 更新計數器
alert("i目前的值為"+i);
}
其實for循環語句完全可以這樣寫,下面的代碼和上面的效果是一樣的(雖然沒有必要,但從這樣的代碼可清楚看出for循環如何工作的)
var i=0;//循環進行之前初始化i
for(;;) {//for語句括号中必須有三個語句,但可以為空語句
if (i<10) {//當條件為true時才執行代碼
alert("i目前的值為"+i);
} else {//當條件為false時就退出循環
break;//使用break退出循環
}
}
一個死循環最能說明while的工作方式了(但這樣的錯誤我們絕不能在實際程式設計中出現)
while (true) {
alert("你關不掉我的!");//這就是網上那些所謂的高手寫的“關不上的窗(周傳雄新歌,力薦)”代碼
}
do..while循環與while循環不同之處在于它至少将代碼塊中的代碼執行一次
do {
alert("我肯定會出現一次的");
} while (false);
三,常用内置對象
從傳統意義上來說,ECMAScript 并不真正具有類。事實上,除了說明不存在類,在 ECMA-262 中根本沒有出現“類”這個詞。ECMAScript 定義了“對象定義”,邏輯上等價于其他程式設計語言中的類。
所謂内置對象就是ECMAScript提供出來的一些對象,我們知道對象都是有相應的屬性和方法,其實這裡很多的js對象跟python的很多文法類似。
對象的概念與分類
- 由ECMAScript定義的本地對象.獨立于宿主環境的 ECMAScript 實作提供的對象.(native object)
- ECMAScript 實作提供的、獨立于宿主環境的所有對象,在 ECMAScript 程式開始執行時出現.這意味着開發者不必明确執行個體化内置對象,它已被執行個體化了。ECMA-262 隻定義了兩個内置對象,即 Global 和 Math (它們也是本地對象,根據定義,每個内置對象都是本地對象)。(built-in object)
- 所有非本地對象都是宿主對象(host object),即由 ECMAScript 實作的宿主環境提供的對象。所有 BOM 和 DOM 對象都是宿主對象。
object對象:ECMAScript 中的所有對象都由這個對象繼承而來;Object 對象中的所有屬性和方法都會出現在其他對象中。
ToString() : 傳回對象的原始字元串表示。
ValueOf() : 傳回最适合該對象的原始值。對于許多對象,該方法傳回的值
都與 ToString() 的傳回值相同。
11種内置對象
包括:
Array ,String , Date, Math, Boolean, Number Function, Global, Error, RegExp , Object
簡介:
在JavaScript中除了null和underfined以外的其他的資料類型都被定義成了對象,也可以用建立對象的方法定義變量,String,Math,Array,Date,RegExp都是JavaScript中重要的内置對象,在JavaScript程式中大多數功能都是通過對象實作的
<script language="javascript">
var aa=Number.MAX_VALUE;
//利用數字對象擷取可表示最大數
var bb=new String("hello JavaScript");
//建立字元串對象
var cc=new Date();
//建立日期對象
var dd=new Array("星期一","星期二","星期三","星期四");
//數組對象
</script>
3.1 數組 Array
1.數組的建立方式
- 字面量方式建立(推薦大家使用這種方式,簡單粗暴)
var colors = ['red','color','yellow'];
- 使用構造函數(後面會講)的方式建立 使用new關鍵詞對構造函數進行建立對象
var colors2 = new Array();
2,數組的指派
var arr = [];
//通過下标進行一一指派
arr[0] = 123;
arr[1] = '哈哈哈';
arr[2] = '嘿嘿嘿'
3 數組的常用方法
方法 | 描述 |
---|---|
concat() | 把幾個數組合并成一個數組 |
join() | 傳回字元串,其中包含了連接配接到一起的數組中的所有元素,元素由指定的分割符分割開來 |
pop() | 移除數組的最後一個元素 |
shift() | 移除數組的第一個元素 |
unshift() | 往數組的開頭添加一個元素,并且傳回新的長度 |
slice(start,end) | 傳回數組的一段 |
push() | 往數組的最後添加一個元素,并傳回新的長度 |
sort() | 對數組進行排序 |
reverse() | 對數組進行反轉 |
length | 它是一個屬性,唯一的一個,擷取數組的長度,可以結合for循環周遊操作 |
3.2 字元串String
charAt() | 傳回指定索引的位置的字元 |
傳回字元串值,表示兩個或多個字元串的拼接 | |
match() | 傳回正規表達式模式對字元串進行産找,并将包含查找結果作為結果傳回(後面正規表達式課程會詳細講) |
replace(a,b) | 字元串b替換了a |
search(stringObject) | 知名是否存在相應比對。如果找到一個比對,search方法将傳回一個整數值,指明這個比對距離字元串開始的偏移位置。如果沒有找到比對,傳回-1 |
slice(start,end) | 傳回start到end-1之間的字元串,索引從0開始 |
split(’a‘,1) | 字元串拆分,以a拆分,第一個參數傳回數組的最大長度 |
substr(start,end) | 字元串截取,左閉右開 |
toUpperCase() | 傳回一個新的字元串,該字元串字母都變成了大寫 |
toLowerCase() | 傳回一個新的字元串,該字元串字母都變成了小寫 |
//1.将number類型轉換成字元串類型
var num = 132.32522;
var numStr = num.toString()
console.log(typeof numStr)
//四舍五入
var newNum = num.toFixed(2)
console.log(newNum)
3.3 Date日期對象
建立日期對象隻有構造函數一種方式,使用new關鍵字
//建立了一個date對象
var myDate = new Date();
常用的方法
文法 | 含義 |
---|---|
getDate() | 根據本地時間傳回指定日期對象的月份中的第幾天(1-31)。 |
Date() | 根據本地時間傳回當天的日期和時間 |
getMonth() | 根據本地時間傳回指定日期對象的月份(0-11) |
getFullYear() | 根據本地時間傳回指定日期對象的年份(四位數年份時傳回四位數字) |
getDay() | 根據本地時間傳回指定日期對象的星期中的第幾天(0-6) |
getHours() | 根據本地時間傳回指定日期對象的小時(0-23) |
getMinutes() | 根據本地時間傳回指定日期對象的分鐘(0-59) |
getSeconds() | 根據本地時間傳回指定日期對象的秒數(0-59) |
3.4 Math 内置對象
常用内置對象
Math.floor() | 向下取整,稱為"地闆函數" |
Math.ceil() | 向上取整,稱為'地闆函數' |
Math.max(a,b) | 求a和b中的最大值 |
Math.min(a,b) | 求a和b中的最小值 |
Math.random() | 随機數,預設0-1之間的随機數,公式min+Math.random()*(max-min),求min~max之間的數 |
不經一番徹骨寒 怎得梅花撲鼻香