第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以上的浮點數值轉爲科學計數法表示。雖然小數點前可以沒有整數,但是不推薦這種寫法。
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;
返回結果是: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中的函數不能實現重載,即不能同時命名兩個名字相同的函數,如果存在兩個函數名相同的函數,則該名字只屬於後定義的函數。