JavaScript高階程式設計:基本概念上
1.語法
①區分大小寫:
ECMAScript中的一切(變數、函式名和操作符)都區分大小寫。
②識別符號:
識別符號(變數、函式、屬性的名字或函式的引數),第一個字元必須是一個字母、下劃線或一個美元符號,其他字元可以是字母、下劃線、美元符號或數字。
ECMAScript採用駝峰大小寫格式。
③註釋
單行註釋://
塊註釋:以/*開頭 ,以*/結尾
④嚴格模式:
ECMAScript5引入了嚴格模式的概念。
要在整個指令碼啟用嚴格模式,可在頂部新增程式碼:
"use strict"
也可指定函式在嚴格模式下執行:
function doSomething(){
"use strict";
//函式體
}
⑤語句:
ECMAScript中語句是以;為結尾,如果省略分號由解析器確定語句的結尾。
雖然條件控制語句只在執行多條語句時要求使用程式碼塊,但最佳實踐是在控制語句中使用程式碼塊——即使程式碼塊中只有一條語句。
2.關鍵字和保留字
ECMA-262描述了一組具有特定用途的關鍵字,這些關鍵字可用於表示控制語句的開始或結束,或者用於特定操作。關鍵字是語言保留的,不可作為識別符號。(第五版關鍵字中新增了debugger)
ECMA-262還描述了另外一組不可用作識別符號的保留字。保留字在這門語言還沒有任何特定的用途,但可能在將來作為關鍵字使用。(第五版保留字中新增了let和yield)
3.變數
ECMAScript的變數是鬆散型別的,可以用來儲存任何型別的資料。
定義變數要使用 var操作符。
var message;
ECMAScript也支援直接初始化變數。初始化的過程僅僅是給變數賦一個值而已。因此可以在修改變數值地同時修改變數的型別。
可以使用一條語句定義多個變數,不過需要使用逗號分隔開。因此ECMAScript是鬆散型別,所以使用不同型別初始化變數的操作可以放在一條語句中完成。
用var操作符定義的變數將成為定義該變數的作用域中的區域性變數。可以像下面那樣省略var操作符,從而建立一個全域性變數:
function test(){
message="hi";
}
在嚴格模式下不能定義名為eval或arguments的變數,否則會導致語法錯誤。
4.資料型別
①typeof操作符:
typeof操作符可用來檢測給定變數的資料型別:
- “undefined”:這個值未定義
- “boolean”:這個值為布林值
- “string”:這個值為字串
- “number”:這個值為數值
- “object”:這個值為物件
- “function”:這個值為函式
有時候,typeof操作符會返回令人迷惑但技術上正確的值。typeof null會返回“object”,因為null被看做一個空的物件引用。
②Undefined型別
undefined型別只有一個值,即特殊的undefined。在宣告變數但未對它初始化時,這個變數的值就是undefined。
不過包含undefined值的變數與尚未定義的變數還是不一樣的:對尚未宣告過的變數只能執行typeof操作符檢測它的資料型別。
然而令人困惑的是,無論對未初始化的變數還是對未宣告的變數,執行typeof操作符同樣都是返回undefined值。因為這兩種變數從技術角度看,無論對哪種變數也不可能執行真正的操作。
③Null型別
Null型別也只有一個值。從邏輯角度看,null表示一個空物件指標。
如果定義的變數在將來準備儲存物件,那麼最好將變數初始化為null而不是其他值。這樣直接檢查null值就知道相應變數是否儲存了一個物件的引用。
if(car!=null){
//對car物件的操作
}
null和undefined的之間的相等操作總是會返回true,這個操作符出於比較會轉換其運算元。
④Boolean型別:
該變數只有兩個字面量:true和false。true不一定等於1,false不一定等於0。
ECMAScript中所有型別都有與這兩個Boolean值等價的值。要將一個值轉換為Boolean值,可以呼叫Boolean()。至於返回這個值為false或true,取決於轉換值地資料型別和實際值。這些轉換規則對理解控制語句自動執行Boolean轉換非常重要。
資料型別 | 轉換為true的值 | 轉換為false的值 |
Boolean | true | false |
String | 任何非空字元 | “” |
Number | 任何非零字元 | 0和NaN |
Object | 任何物件 | null |
Undefined | n/a(不適用) | undefined |
⑤Number型別:
這種型別使用IEEE754格式來表示整數和浮點數值。
八進位制字面值第一位必須為0,八進位制字面量在嚴格模式是無效的。十六進位制字面量前兩位必須是0x。在進行算術運算時,所有以八進位制或十六進位制表示的數值都轉換為十進位制。
1)浮點數值
浮點數:該數值中必須包含一個小數點。
由於儲存浮點數需要的記憶體空間是儲存整數值的兩倍,則ECMAScript會不失時機地將浮點數值轉換為整數值。(如果小數點沒有跟任何數字,那麼這個數值就可作為整數值來儲存)
對於極大數值可使用科學計數法的浮點數值來表示。
浮點數值的最高精度是17位,但在進行算術運算其精確度遠遠不如整數。(0.1+0.2的結果不是0.3,而是0.30000000000000004)因此,永遠不要測試某個特定的浮點數值。
2)數值範圍
ECMAScript能表示的最小數值儲存在 Number.MIN_VALUE。
ECMAScript能表示的最大數值儲存在 Number.MAX_VALUE。
Infinity是不能夠參與計算的數值。isFinite()函式可確定數值是否為有窮的。
3)NaN(Not a Number)
這個值用於表示一個本來要返回數值的運算元未返回數值的情況。
任何涉及NaN的操作都會返回NaN。NaN不與任何值相等,包括NaN本身。
isNaN()函式會確定引數是否不是數值。
4)數值轉換
有三個函式可以把非數值轉換為數值:Number()、parseInt()和parseFloat()。
Number():
1)Boolean值:true為1,false為0 |
2)數字值:簡單傳入和返回 |
3)null:返回0 |
4)undefined:返回NaN |
5)字串: |
只包含數字:轉換為十進位制數值 |
包含有效浮點數:將其轉換為對於浮點數值 |
包含有效十六進位制格式:轉換為相同大小的十進位制數值 |
空:轉換為0 |
包含上述所有格式之外字元:返回NaN |
6)物件:呼叫valueOf()方法,依照前面規則。如果結果為NaN,則呼叫toString()方法,然後再依照前面規則 |
parseInt():
忽略字串前面的空格,直到找到第一個非空格字元。如果第一個字元不是數字或負號,返回NaN。如果第一個字元是數字,parseInt()繼續解析第二個字元直到解析完所有後續字元或者遇到一個非數字字元。
parseInt()能識別各種整數格式。
ECMAScript5 JavaScript引擎中,parseInt()已經不具備解析八進位制的能力。
為了解除對parseInt函式的疑惑,我們可為函式提供第二個引數:轉換時使用的基數。
parseFloat():
parseFloat()也是從第一字元開始解析每個字元。一直解析到字串末尾或解析遇到一個無效的浮點數字字元為止。parseFloat()只解析十進位制值,因此它沒有第二個引數指定基數的用法。如果字串包含的是一個可解析為整數的值,parseFloat()會返回整數。
⑥String型別:
字串可以由單引號或雙引號表示。
1)字元字面量:也叫轉義字元
2)字串的特點:字串一旦建立,它的值就不能改變。要改變某個變數儲存的字串,首先要先摧毀原來的字串,然後再用另一個新值地字串填充該變數。
var lang="Java";
lang=lang+"Script";
/* 這個操作的過程:建立一個容納十個字元的新字串
* 然後在這個字元填充"Java"和"Script"
* 再摧毀原來的字串"Java"和字串"Script"
*/
3)轉換為字串:
使用幾乎每個值都有的toString()方法:返回相應值地字串表現。但null和undefined值沒有這個方法。在呼叫數值的toString方法可傳遞一個引數:輸出數值的基數。
在不知道是否為undefined值或null值的情況下,還可以使用轉型函式String()。這個函式可將所有型別的值轉換為字串。
1)如果值有toString():呼叫toString() |
2)null:返回“null” |
3)undefined:返回“undefined” |
⑦Object型別:
ECMAScript中的物件:一組資料和功能的集合。
可執行new操作符後跟要建立的物件型別名稱來建立。建立Object的例項,並未其新增屬性和方法。
var o=new Object();
如果不給建構函式傳遞引數,可省略後面一對圓括號。
在ECMAScript中,Object型別是所有它的例項的基礎。Object型別所具有的任何屬性和方法也同樣存在更具體的物件中。
constructor:儲存著用於建立當前物件的函式 |
hasOwnProperty(propertyName):檢查給定屬性在當前物件例項是否存在 |
isPrototypeof(object):傳入的物件是否是當前物件的原型 |
propertyIsEnumerable(propertyName):給定屬性是否能夠使用for-in語句 |
toLocaleString():返回物件的字串表示 |
toString():返回物件的字串表示 |
valueOf():返回物件的字串、數值或布林值表示 |