JavaScript高級程序設計(第3章 基本概念)

第3章 基本概念

3.1.1 Page 19 區分大小寫

ECMAScript中的一切(變量、函數名和操作符)都區分大小寫。


3.1.2 Page 19 標識符

標識符,指變量、函數、屬性的名字,或者函數的參數。
標識符格式規則:
1、第一個字符必須是字母、下劃線(_)或者美元符號($);
2、其他字符可以是字母、下劃線、美元符號或者數字;
3、標識符一般採用駝峯大小寫格式,即第一個字母小寫,剩下每個單詞的首字母大寫;
4、關鍵字、保留字、true、false和null不能做標識符。


3.1.3 Page 20 註釋

單行註釋用 ://
多行註釋用:
/*
*(可以省略)
*(可以省略)
*/


3.1.4 Page 20 嚴格模式

ECMAScript 5 引入了嚴格模式(strict mode),可以在JavaScript代碼頂部添加如下代碼(或者函數內部的頂部):
“use strict”;


3.1.5 Page 20 語句

單條語句都建議以一個分號“;”結尾;
多條語句可以放入一個花括號裏“{}”;
如:
{
var a=1;
alert(a);
}


3.2 Page 21 關鍵字和保留字

嚴格模式
關鍵字,用於表示控制語句的開始或結束,或者用於執行特定操作等:
break  case  catch  continue  debugger  default  delete  do  else  finally  for  function  
if  in  instanceof  new  return  switch  this  throw  try  typeof  var  void  while  with 

保留字,可能將來被用作關鍵字:
abstract  boolean  byte  char  class  const  debugger  double enum  export  extends  final  float  goto  implements import  int
interface  long  native  package  private  protected  public  short  static  super  synchronized  throws  transient  volatile let yield eval arguments

非嚴格模式
保留字:
class  const  enum  extends  import  super


3.3 Page 22 變量

ECMAScript的變量是鬆散型的,可以用來保存任何類型的數據,僅僅是一個用來保存值的佔位符。

變量操作符var 後面跟變量名:
var a;(像這樣未經過初始化,即未賦值的變量,會保存一個特殊值undefined)

也可以直接給變量賦值:
var a=“Aubrey”; (變量就保存了一個字符串)

注意:var操作符定義的變量將成爲定義該變量的作用域中的局部變量。即,如果在一個函數中用var定義一個變量,則這個變量在函數退出後就會被銷燬。

定義多個變量,例:
var message = "hi",
      found = false,
       age = 29;


3.4 Page 23 數據類型

ECMAScript中有五種簡單數據類型(也稱爲基本數據類型)+1種複雜數據類型。
基本數據類型:
1、Undefined 未定義
2、Null 空
3、Boolean 布爾值
4、Number 數字
5、String 字符串

複雜數據類型:
Object 對象


3.4.1 Page 23 typeof操作符
 
typeof 操作符用來鑑定數據類型。它可返回的值有以下:
1、undefined 未定義
2、boolean 布爾值
3、string 字符串
4、number 數字
5、object 對象
6、function 函數

使用語法:
var a = “Gabriel”;
alert(typeof a); 變量外可以不加括號
alert (typeof (a)); 也可以加括號
alert (typeof 25);


3.4.2 Page 24 Undefined 類型

Undefined數據類型只有一個值,undefined。
可以給變量顯示地賦值爲undefined(不推薦),或者申明一個未初始化的變量(默認值爲undefined)。


3.4.3 Page 25 Null類型

Null數據類型只有一個值,null。
Null值表示一個空指針對象,因此當使用typeof操作符檢測數據類型時會返回object。
建議:只要在要保存對象的變量還沒有真正保存對象,就應該明確地讓該變量保存null值。


3.4.4 Page 26 Boolean類型

Boolean數據類型有兩個值,true和false。
ECMAScript中所有類型的值都有與這兩個Boolean值等價的值。
要將一個值轉換爲其對應的Boolean值,可以調用轉型函數Boolean(),如:
var a = "Aubrey";
var b = Boolean(a);
b的返回值是:true

                             Boolean轉型函數的轉換規則
數據類型 轉換爲true的值 轉換爲false的值
Boolean true false
String 任何非空字符串 " "(空字符串)
Number 任何非零數字值(包括無窮大) 0和NaN
Object 任何對象 null
Undefined n/a(或N/A),no application不適用 undefined

擴展:if循環語句會自動把數據類型轉換爲Boolean值。如下:
var message = "Aubrey";
if(massage){
alert("Value is true");
}


3.4.5 Page 27 Number類型

數值字面量格式:

擴展:JavaScript數值可以保存(+0)和(-0),這兩個值被認爲是相等的。

1.浮點數值

所謂浮點數值,指的是該數值中必須包含一個小數點,小數點後必須包含一位及以上數字,ECMAScript會將那些小數點後面帶有6個0以上的浮點數值轉爲科學計數法表示。雖然小數點前可以沒有整數,但是不推薦這種寫法。
  • 對於極大或極小的數值,可以採用科學計數法表示,如:312550000可以表示爲3.125e7(即3.125乘以7的10次)
  • 浮點數值的最高精度是17位小數,由於使用基於IEEE754數值的浮點計算,有時出現問題:比如,0.1+0.2=0.30000000000000004。
  • 浮點數值加減舍入誤差問題單獨寫了一篇文章http://blog.csdn.net/einafetsslly/article/details/77771846
2.數值範圍
  • ECMAScript能表示的最小數值保存在Number.MIN_VALUE中,一般爲5e-324;超過這個數值將會被轉換爲-Infinity(負無窮)。
  • ECMAScript能表示的最大數值保存在Number.MAX_VALUE中,一般爲1.7976931348623157e+308;超過這個數值將會被轉換爲+Infinity(正無窮)。
  • Infinity是不能參與計算的,因此要判斷一個數值是否是有窮的,可以使用isFinite()函數。
            實例:
var result = Number.MAX_VALUE + Number.MAX_VALUE;
alert(isFinite(result));
            返回結果是:false

3.NAN(Not a Number)非數值

  • 任何數值與非數值進行計算都會返回NaN;
  • NaN與任何值都不想等,包括NaN本身;
  • isNaN()函數:判斷一個值是否是非數值,先會嘗試把該值轉換爲數值(比如字符串“10”可以被轉換被數值10,true可以被轉換爲數值1)。
4. 數值轉換

有3個函數可以把非數值轉換爲數值:Number()、parseInt()、parseFloat()

Number():適用於任何數據類型,轉換規則如下:
  • Boolean值的true和false轉換爲1和0;
  • 數字值則返回數字值;
  • null值則返回0;
  • undefined值則返回NaN;
  • 字符串:
    • 字符串裏含有數字值(什麼格式的都行),則會返回想對應的十進制數值;
    • 空字符串,則返回0;
    • 不含數值的非空字符串,則返回NaN。
parseInt():用於把字符串轉換爲數字值,或者把小數轉換爲正數(直接去掉小數部分):
  • 當字符串的第一個字符是非數字或者負號時,返回NaN;
  • 否則會解析到非數字字符爲止,如parseInt("1234blue")=1234;
  • 可以爲此函數提供一個參數(告訴它轉換時使用多少進制),如parseInt("070","8");
parseFloat():用於把字符串轉換爲數字值,但是它只能解析十進制數字,且只能識別一個小數點,碰到第二個小數點時停止解析,如parseFloat("01.23.4")=1.23;


3.4.6 Page 32 String 字符串類型

字符串需要用雙引號“”或者單引號''包圍,它是不可變的。
1.字符字面量
也叫轉義序列,用於表示非打印字符,或者具有其他用途的字符。
字面量 含義
\n 換行
\t 製表
\b 退格
\r 回車
\f 進紙
\\ 斜槓
\' 單引號
\'' 雙引號
\xnn 不常用,不摘錄
\unnnn 不常用,不摘錄

比如:
<script>
	var a = "Aubrey\nAubrey";
	alert(a);
</script>
運算結果是:
Aubrey
          Aubrey

2.轉換爲字符串

方法一: toString(),適用於數值、布爾值、對象和字符串值,不適用於undefined和null。
語法實例:
var a = 10;
alert(a.toString());     //會得到字符串10
一般不需要傳遞參數(即括號裏不用填參數),但可以填入2、8、10、16代表所需傳回的數的進制數(默認的進制數爲10)。如:a.toString(8)

方法二:String(),使用於任何數據類型
轉換規則:
  • 數據有toString()方法時返回toString方法的值;
  • 數據爲null時返回null;
  • 數據爲undefined時返回undefined;
擴展:值轉字符串的方法:“”+值

3.4.7 Page 35 Object類型

ECMAScript中的對象其實就是一組數據和功能的集合。
對象可以通過執行new操作符後跟要創建的對象類型名稱來創建。例:
var o = new Object();


3.5 Page 36 操作符

操作符用來操作數據值,包括算術操作符(如加減乘除)、位操作符、關係操作符和相等操作符。

3.5.1 Page 36 一元操作符

只能操作一個值的操作符叫一元操作符,適用於數值、字符串、布爾值、對象。

1.遞增和遞減操作符:分爲前置型(++和--操作符放在變量前)和後置型(++和--操作符放在變量後)

++ 自增1
-- 自減1

前置型和後置型的區別在於,前置型變量自增自減後的值是在語句被求值以前改變的,後置型變量自增自減後的值是在語句被求值之後改變的。
此規則隻影響多次計算的語句,不影響單詞計算的語句。如下:

實例1:
var a = 20;
a++;   //a = 21
實例2:
var a = 20;
++a;    //a = 21 
實例1和實例2都是單次計算的語句,因此不受影響,a的值都爲21。

實例3:
var a = 20;
var b = a-- + 1;   //b = 21
var c = a +1;      //c = 20
實例4:
var a = 20;
var b = --a + 1;   //b = 20
實例3中a的值實在b的計算語句結束後再自減1的,實例4中則是在計算c的值時同時自減1了。

2.一元加(+)和減(-)操作符

放在等號後數值前,加號不會對數值產生影響,減號可以將正數轉爲負數。
而放在等號前,如下:
var a = 5;
a+=3;   //a = 8, 意爲a = a + 3


3.5.2 位操作符

1.按位非(NOT)
按位非操作符是一個波浪線(~),結果是返回數值的反碼,即操作數的負值減1。
實例:
var a = 25;
var b = ~a;    //b=-26

2.按位與(AND)
按位與操作符是一個和號字符(&),返回結果只有兩個值,1和0。
目前還沒見到哪裏有用到,所以不做摘錄,詳見Page 41 。

3.按位或(OR)
按位或操作符是一個豎線符號(|),
返回結果只有兩個值,1和0。
目前還沒見到哪裏有用到,所以不做摘錄,詳見Page 41 。

4.按位異或(XOR)
按位異或操作符是一個插入符號(^), 返回結果只有兩個值,1和0。
目前還沒見到哪裏有用到,所以不做摘錄,詳見Page 42 。

5.左移
左移操作符(<<),會將數值的所有位向左移動指定的位數。
實例:
var a = 2;
var b = a << 5;   //b=64

6.有符號的右移
有符號右移操作符(>>), 會將數值向右移動,但保留符號位。

7.無符號右移
無符號右移操作符(>>>),會將數值的所有位(含符號位)向右移動。

3.5.3 Page 44 布爾操作符

布爾操作符一共有3個:非(NOT)、與(AND)和或(OR)。

1.邏輯非(NOT)

邏輯非操作符由一個歎號(!)表示,可以應用於ECMAScript中的任何值。它會將被操作數先轉換爲一個布爾值,然後對其求反。

實例:
alert(!false);       //true
alert(!"");            //true
alert(!"blue");     //false

同時使用兩個邏輯非操作符,相當於Boolean()轉型函數,可以將一個值轉換爲其對應的布爾值。
如:
alert(!!"blue");    //true


2.邏輯與(AND)

邏輯與操作符由兩個和號(&&)表示,可以應用於任何類型的操作數,只有兩個值都爲真時才爲真。
邏輯與操作屬於短路操作,即如果第一個操作符能決定結果,就不會對第二個操作符求值。

實例:

var result = (false && true);
alert(result);        //結果爲false,因爲第一個值爲false

var result = (true && true);
alert(result);        //結果爲true,判斷完第一個值後又繼續判斷了第二個值

3.邏輯或(OR)

邏輯或操作符由兩個豎線符號(||),與邏輯與操作符類似,它也是短路操作符,有一個爲真即爲真。

3.5.4 Page 47 乘性操作符

ECMAScript定義了3個乘性操作符:乘法、除法和求模(求餘數)。
當操作數爲非數值時,會先使用Number()轉型函數將其轉換爲數值,再進行計算。

1.乘法
乘性操作符由一個星號(*)表示。
Infinity*0=NaN;

2.除法
除法操作符由一個斜線符號(/)表示。
Infinity/Infinity=NaN;
0/0=NaN;

3.求模
求模操作符由一個百分號(%)表示,就是求餘數。
實例:
var result = 26%5;     //等於1
無窮%有限=NaN;
有限%0=NaN;
無窮%無窮=NaN;

3.5.5 Page 48 加性操作符

1.加法
加法操作符由一個加號(+)表示,計算順序從左至右,加()可以改變執行順序。

2.減法
減法操作符由一個減號(-)表示,計算順序從左至右,加()可以改變執行順序。

3.5.6 Page 50 關係操作符

小於(<)、大於(>)、小於等於(<=)和大於等於(>=)。
如果兩個操作數都是字符串,則比較兩個字符串對應的字符編碼值。
大寫字母的字符編碼全部小於小寫字母的字符編碼。
任何操作數與NaN進行關係比較,結果都是false。

3.5.7 Page 51 相等操作符

1.相等和不相等 (==和!=)

比較前,會先轉換操作數(通常稱爲強制轉換) 。
null == undefined;
NaN != NaN;

2.全等和不全等(=== 和 !==)

直接比較,不會進行強制轉換。
null === undefined;

3.5.8 Page 53 條件操作符(三目運算符)

(條件語句)?代碼1:代碼2;
代碼1:條件語句爲true時執行的代碼;
代碼2:條件語句爲false時執行的代碼。

3.5.9 Page 53 賦值操作符

1.簡單賦值操作符

簡單的賦值操作符由等於號(=)表示,把右側的賦值給左側的變量。
實例:
var num = 10;
num = num + 10;

2.複合賦值操作符

乘/賦值(*=)
除/賦值(/=)
模/賦值(%=)
加/賦值(+=)
減/賦值(-=)
左移/賦值(<<=)
有符號右移/賦值(>>=)
無符號右移/賦值(>>>=)

實例: num=num+10 就等同於 num+=10

3.5.10 Page 54 逗號操作符

使用逗號操作符就可以在一條語句中執行多個操作。
如:
var num1=1,num2=2,num3=3;


3.6 Page 54 語句

語句,也成爲流控制語句,通常使用一或多個關鍵字來完成給定任務。

3.6.1 Page 54 if語句

語法1:
if(條件){
代碼1;
} else {
代碼2;
}

語法2:
if(條件){
代碼1;
} else if {
代碼2;
} else{
代碼3;
}
其中else if 語句不限制個數。

3.6.2 Page 55 do-while語句

do-while語句是一種後測試循環語句,即只有在循環體中的代碼執行後,纔會測試出口條件。

語法:
do{
代碼;
} while(條件);

實例:
var i = 0;
do {
i += 2;
} while (i<10);
alert(i);      //結果爲10

3.6.3 Page 55 while語句

while語句屬於前測試循環語句,即在循環體內的代碼被執行之前,會對出口條件求值。

語法:
while(條件){
代碼;
}

3.6.4 Page 56 for語句

for語句也是一種前測試循環語句,但是它具有在執行循環之前初始化變量和定義循環後要執行的代碼的能力。

語法:
for(變量初始化;條件;循環語句){
代碼;
}
變量的初始化也可以放在for循環外。
如:
var count = 10;
var i;      //變量初始化;
for(i=0;i<count;i++){
  alert(i);
}

由於ECMAScript中不存在塊級作用域,因此在循環內部定義的變量也可以在外部訪問到。

另外,for語句中的初始化表達式、控制表達式和循環後表達式都是可選的。將這三個表達式全部省略,則會創建一個無限循環。

3.6.5 Page 57 for-in語句

for-in 語句是一種精準的迭代語句,可以用來遍歷數組或對象的屬性。

語法:
for(變量in對象){
代碼;
}

實例:
var a={fname:"John",lname:"Doe",age:25};
var text="";
var x;
for(x in a){
text+=a(x);
}     //輸出結果爲 John Doe 25

當要遍歷的對象的變量值爲null或undefined時,會停止執行循環體。

3.6.6 Page 58 label語句

使用label語句可以在代碼中添加標籤,以便將來使用。

語法:
標籤名:代碼(一般都是循環語句)

實例:
start:for(var i=0;i<count;i++){
alert(i);
}
這個例子中的start標籤可以在將來由break或者continue語句引用。

3.6.7 Page 58 break和continue語句

break和continue用於在代碼中精確地控制代碼的執行。

break:停止/中斷循環,強制繼續執行循環後面的語句。

continue:跳過此次循環繼續從循環的頂部繼續循環。

break/continue與label標籤合用的循環嵌套實例請見P59。

3.6.8 Page 60 with語句

with語句的作用是將代碼的作用域設置到一個特定的對象中。

語法:
with(對象){
代碼;
}

實例:
var qs = location.search.substring(1);
var hostName = location.hostname;
var url = location.href;
以上代碼可以簡寫爲:
with(location){
var qs = search.substring(1);
var hostName = hostname;
var url = href;
}

嚴格模式下,不允許使用with語句,會被視爲語法錯誤;
在開發大型應用程序時,不建議使用with語句。

3.6.9 Page 60 switch語句

語法:
switch(表達式:可以是任何數據類型){
case value1:代碼1;
break;
case value2:代碼2;
break;
...
default:代碼N;
}

case的意思是:如果表達式等於這個值(value),則執行後面的代碼。
switch在比較值時使用的是全等操作符,因此不會發生類型轉換。


3.6 Page 62 函數

ECMAScript中的函數使用function關鍵字來申明,後面跟一組參數以及函數體。函數可以通過函數名來調用,後面還要加上一堆圓括號和參數(圓括號中的參數如果有多個,可以用逗號隔開)。

語法:
function 函數名(參數1,參數2){
代碼;
}

return返回值

--返回值用return 定義,如:return a;
--函數在定義時不必指定是否返回值;
--函數會在執行完return語句後會立即停止並退出;
--一個函數中可以有多個return語句,如:函數中放一個if循環語句,if里加一個return,else里加一個return;
--return語句也可以不帶有任何返回值,函數在停止執行後將返回undefined。

3.7.1 Page 64 理解參數

EcMAScript中的參數在內部是用一個數組來表示的,沒有數量和數據類型要求。
在函數體內可以通過arguments對象來訪問這個參數數組,從而獲取傳遞給函數的每一個參數。
函數中命名的參數只提供便利,但不是必需的;沒有傳遞值的命名參數將自動被賦予undefined值。

參數數組的長度可以寫作:arguments.length
參數:arguments[0]代表第一個參數,arguments[1]代表第二個參數,以此類推。

實例:
function doAdd(num1,num2){
if(arguments.length==1){
alert(num1+num2);
} else if (arguments.length==2){
alert(arguments[0]+num2);
}
}
上面的實例中,num1=arguments[0]

3.7.2 Page 66 沒有重載

在ECMAScript中的函數不能實現重載,即不能同時命名兩個名字相同的函數,如果存在兩個函數名相同的函數,則該名字只屬於後定義的函數。
























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