第二章 在HTML中使用JavaScript
1、<script>元素的屬性
1)async:可選,表示立即下載腳本,但可以同時進行頁面的其他操作,async=”async”,只適用於外部文件,Firefox3.6、Safari5和Chrome有效
2)charset:可選,表示通過src屬性指定的代碼的字符集
3)defer:可選,表示腳本可以延遲到文檔完全被解析和顯示之後再執行,defer=”defer”,只適用於外部文件,IE4、Firefox3.5、Safari5和Chrome有效
4)language:已廢棄
5)src:可選,表示包含要執行代碼的外部文件
6)type(MIME類型):可選,表示編寫代碼使用腳本語言的內容類型,一般為type=text/javascript
2、<script>元素的使用:包含在<script>元素內部的JavaScript代碼將被從上至下依次解釋,在解釋器對<script>元素內部的所有代碼求值完畢以前,頁面中的其余內容都不會被浏覽器加載或顯示。注意不要在非結束位置放置</script>,或者使用轉義字符“\”。
1)直接在頁面中嵌入JavaScript代碼:<script type=”text/javascript”></script>
2)包含外部JavaScript文件:<script type=”text/javascript” src=”example.js”></script>,注意不要再包含嵌入代碼。
第三章 基本概念
1、語法
1)區分大小寫
2)標識符:第一個字符必須是一個字母,下劃線和美元符號,其他字符可以是字母、下劃線、美元符號或數字。ECMAScript標識符采用駝峰大小寫格式,也就是第一個字母小寫,剩下的每個單詞的首字母大寫
3)注釋:單行注釋//,多行注釋/**/
2、變量:定義變量都使用var操作符,用var操作符定義的變量將成為定義該變量的作用域中的局部變量;省略var操作符創建的變量是全局變量;可以使用一個語句定義多個變量,用逗號分隔
3、數據類型:基本數據類型:Undefined、Null、Boolean、Number和String;復雜數據類型:Object
1)typeof操作符:對一個值使用 typeof 操作符可能返回下列某個字符串:
"undefined" ——如果這個值未定義;
"boolean" ——如果這個值是布爾值;
"string" ——如果這個值是字符串;
"number" ——如果這個值是數值;
"object" ——如果這個值是對象或 null ;
"function" ——如果這個值是函數。
2)Undefined類型:undefined用於表示未經初始化的變量
3)Null類型:值為null用於表示空對象指針
4)Boolean類型:值為true或false;Boolean()函數:將一個值轉換為其對應的 Boolean 值。
數據類型
轉換為true的值
轉換為false的值
Boolean
true
false
String
任何非空字符串
" "(空字符串)
Number
任何非零數字值(包括無窮大)
0和NaN
Object
任何對象
null
Undefined
n/a(不適用)
undefined
5)Number類型:十進制、八進制(第一位必須是0,後面是0~7)、十六進制(第一位必須是0x,後面是0~F);在進行算術計算時,所有以八進制和十六進制表示的數值最終都將被轉換成十進制數值。
浮點數值:由於保存浮點數值需要的內存空間是保存整數值的兩倍,因此 ECMAScript會不失時機地將浮點數值轉換為整數值;
isFinite() 函數:用於確定一個數值是不是有窮的。
NaN:這個數值用於表示一個本來要返回數值的操作數未返回數值的情況;任何涉及 NaN 的操作都會返回 NaN; NaN 與任何值都不相等,包括 NaN 本身。isNaN()函數接收一個參數——任何類型,用於確定這個參數是否不是數值;isNaN() 在接收到一個值之後,會嘗試將這個值轉換為數值;任何不能被轉換為數值的值都會導致這個函數返回 true 。
數值轉換:
Number() 函數的轉換規則如下:
如果是 Boolean 值, true 和 false 將分別被轉換為 1 和 0。
如果是數字值,只是簡單的傳入和返回。
如果是 null 值,返回 0。
如果是 undefined ,返回 NaN 。
如果是字符串,遵循下列規則:
n 如果字符串中只包含數字(包括前面帶正號或負號的情況),則將其轉換為十進制數值(注意:前導的零被忽略了);
n 如果字符串中包含有效的浮點格式,如 "1.1" ,則將其轉換為對應的浮點數值(同樣,也會忽略前導零);
n 如果字符串中包含有效的十六進制格式,例如 "0xf" ,則將其轉換為相同大小的十進制整數值;
n 如果字符串是空的(不包含任何字符),則將其轉換為 0;
n 如果字符串中包含除上述格式之外的字符,則將其轉換為 NaN 。
如果是對象,則調用對象的 valueOf() 方法,然後依照前面的規則轉換返回的值。如果轉換的結果是 NaN ,則調用對象的 toString() 方法,然後再次依照前面的規則轉換返回的字符串值。
parseInt() 函數的轉換規則如下:接收兩個參數——字符串和轉換的基數;如果第一個字符不是數字字符或者負號, parseInt()就會返回 NaN ;如果第一個字符是數字字符, parseInt() 會繼續解析第二個字符,直到解析完所有後續字符或者遇到了一個非數字字符;如果字符串以 "0x" 開頭且後跟數字字符,就會將其當作一個十六進制整數;如果字符串以 "0" 開頭且後跟數字字符,則會將其當作一個八進制數來解析。
parseFloat() 函數的轉換規則如下:字符串中只有第一個小數點是有效的;解析過程中忽略前導的零;十六進制格式的字符串則始終會被轉換成 0;如果字符串包含的是一個可解析為整數的數(沒有小數點,或者小數點後都是零), parseFloat() 會返回整數。
6)String類型:ECMAScript 中的字符串是不可變的,也就是說,字符串一旦創建,它們的值就不能改變。要改變某個變量保存的字符串,首先要銷毀原來的字符串,然後再用另一個包含新值的字符串填充該變量。
toString() 方法:數值、布爾值、對象和字符串值(沒錯,每個字符串也都有一個 toString() 方法,該方法返回字符串的一個副本)都有 toString() 方法。但 null 和 undefined 值沒有這個方;在調用數值的 toString() 方法時,可以傳遞一個參數:輸出數值的基數。
String()方法:如果值有 toString() 方法,則調用該方法(沒有參數)並返回相應的結果;如果值是 null ,則返回 "null" ;如果值是 undefined ,則返回 "undefined" 。
7)Object類型:
constructor :保存著用於創建當前對象的函數。對於前面的例子而言,構造函數(constructor)就是 Object() 。
hasOwnProperty(propertyName) :用於檢查給定的屬性在當前對象實例中(而不是在實例的原型中)是否存在。其中,作為參數的屬性名( propertyName )必須以字符串形式指定。
isPrototypeOf(object) :用於檢查傳入的對象是否是傳入對象的原型。
propertyIsEnumerable(propertyName) :用於檢查給定的屬性是否能夠使用 for-in 語句來枚舉。與 hasOwnProperty() 方法一樣,作為參數的屬性名必須以字符串形式指定。
toLocaleString() :返回對象的字符串表示,該字符串與執行環境的地區對應。
toString() :返回對象的字符串表示。
valueOf() :返回對象的字符串、數值或布爾值表示。通常與 toString() 方法的返回值相同。
5、操作符
1)一元操作符:
執行前置遞增和遞減操作時,變量的值都是在語句被求值以前改變的;
執行後置遞增和遞減操作時,變量的值都是在語句被求值以後改變的;
在對非數值應用一元加操作符時,該操作符會像 Number() 轉型函數一樣對這個值執行轉換。換句話說,布爾值 false 和 true 將被轉換為 0 和 1,字符串值會被按照一組特殊的規則進行解析,而對象是先調用它們的 valueOf() 和(或) toString() 方法,再轉換得到的值。
2)位操作符:
按位非(~)就是返回數值的反碼;
按位與(&)只在兩個數值的對應位都是 1 時才返回 1,任何一位是 0,結果都是 0;
按位或(|)在有一個位是 1的情況下就返回 1,而只有在兩個位都是 0的情況下才返回 0;
按位異或(^)這個操作在兩個數值對應位上只有一個 1 時才返回 1,如果對應的兩位都是 1 或都是 0,則返回 0;
左移(<<)會將數值的所有位向左移動指定的位數,左移不會影響操作數的符號位;
有符號的右移(>>)會將數值向右移動,但保留符號位(即正負號標記),會以符號位的值來填充所有空位;
無符號的右移(>>>)以 0 來填充空位;對正數的無符號右移與有符號右移結果相同,無符號右移操作符會把負數的二進制碼當成正數的二進制碼。
3)布爾操作符:
邏輯非(!):如果操作數是一個對象,返回 false ;如果操作數是一個空字符串,返回 true ;如果操作數是一個非空字符串,返回 false ;如果操作數是數值 0,返回 true ;如果操作數是任意非 0 數值(包括 Infinity ),返回 false ;如果操作數是 null ,返回 true ;如果操作數是 NaN ,返回 true ;如果操作數是 undefined ,返回 true ;
邏輯與(&&):如果第一個操作數是對象,則返回第二個操作數;如果第二個操作數是對象,則只有在第一個操作數的求值結果為 true 的情況下才會返回該對象;如果兩個操作數都是對象,則返回第二個操作數;如果有一個操作數是 null ,則返回 null ;如果有一個操作數是 NaN ,則返回 NaN ;如果有一個操作數是 undefined ,則返回 undefined ;
邏輯或(||):如果第一個操作數是對象,則返回第一個操作數;如果第一個操作數的求值結果為 false ,則返回第二個操作數;如果兩個操作數都是對象,則返回第一個操作數;如果兩個操作數都是 null ,則返回 null ;如果兩個操作數都是 NaN ,則返回 NaN ;如果兩個操作數都是 undefined ,則返回 undefined 。
4)乘性操作符:
乘法(*):如果是 Infinity 與 0 相乘,則結果是 NaN ;如果是 Infinity 與非 0 數值相乘,則結果是 Infinity 或 -Infinity ,取決於有符號操作數的符號;如果是 Infinity 與 Infinity 相乘,則結果是 Infinity ;如果有一個操作數不是數值,則在後台調用 Number() 將其轉換為數值,然後再應用上面的規則;
除法(/):如果是 Infinity 被 Infinity 除,則結果是 NaN ;如果是零被零除,則結果是 NaN ;如果是非零的有限數被零除,則結果是 Infinity 或 -Infinity ,取決於有符號操作數的符號;如果是 Infinity 被任何非零數值除,則結果是 Infinity 或 -Infinity ,取決於有符號操作數的符號;如果有一個操作數不是數值,則在後台調用 Number() 將其轉換為數值,然後再應用上面的規則;
求模(%):如果被除數是無窮大值而除數是有限大的數值,則結果是 NaN ;如果被除數是有限大的數值而除數是零,則結果是 NaN ;如果是 Infinity 被 Infinity 除,則結果是 NaN ;如果被除數是有限大的數值而除數是無窮大的數值,則結果是被除數;如果被除數是零,則結果是零;如果有一個操作數不是數值,則在後台調用 Number() 將其轉換為數值,然後再應用上面的規則。
5)加性操作符:
加法(+):如果有一個操作數是 NaN ,則結果是 NaN ;如果是 Infinity 加 Infinity ,則結果是 Infinity ;如果是 -Infinity 加 -Infinity ,則結果是 -Infinity ;如果是 Infinity 加 -Infinity ,則結果是 NaN ;如果是+0 加+0,則結果是+0;如果是-0 加-0,則結果是-0;如果是+0 加-0,則結果是+0;如果兩個操作數都是字符串,則將第二個操作數與第一個操作數拼接起來;如果只有一個操作數是字符串,則將另一個操作數轉換為字符串,然後再將兩個字符串拼接起來;如果有一個操作數是對象、數值或布爾值,則調用它們的 toString() 方法取得相應的字符串值,然後再應用前面關於字符串的規則;對於 undefined 和 null ,則分別調用 String() 函數並取得字符串 "undefined" 和 "null" ;
減法(-):如果有一個操作數是 NaN ,則結果是 NaN ;如果是 Infinity 減 Infinity ,則結果是 NaN ;如果是 -Infinity 減 -Infinity ,則結果是 NaN ;如果是 Infinity 減 -Infinity ,則結果是 Infinity ;如果是 -Infinity 減 Infinity ,則結果是 -Infinity ;如果是+0 減+0,則結果是+0;如果是+0 減-0,則結果是-0;如果是-0 減-0,則結果是+0;如果有一個操作數是字符串、布爾值、 null 或 undefined ,則先在後台調用 Number() 函數將其轉換為數值,然後再根據前面的規則執行減法計算。如果轉換的結果是 NaN ,則減法的結果就是 NaN ;如果有一個操作數是對象,則調用對象的 valueOf() 方法以取得表示該對象的數值。如果得到的值是 NaN ,則減法的結果就是 NaN 。如果對象沒有 valueOf() 方法,則調用其 toString()方法並將得到的字符串轉換為數值。
6)關系操作符:小於(<)、大於(>)、小於等於(<=)、大於等於(>=), 如果兩個操作數都是數值,則執行數值比較;如果兩個操作數都是字符串,則比較兩個字符串對應的字符編碼值;如果一個操作數是數值,則將另一個操作數轉換為一個數值,然後執行數值比較;如果一個操作數是對象,則調用這個對象的 valueOf() 方法,用得到的結果按照前面的規則執行比較。如果對象沒有 valueOf() 方法,則調用 toString() 方法,並用得到的結果根據前面的規則執行比較;如果一個操作數是布爾值,則先將其轉換為數值,然後再執行比較。
7)相等操作符:
相等和不相等(==、!=):先轉換再比較;
全等和不全等(===、!==):僅比較而不轉換
8)條件操作符:variable = boolean_expression ? true_value : false_value;
9)賦值操作符:乘賦值(*=)、除賦值(/=)、模賦值(%=)、加賦值(+=)、減賦值(-=)、左移賦值(<<=)、有符號右移賦值(>>=)、無符號右移賦值(>>>=)
10)逗號操作符
6、語句
1)if語句
2)do-while語句
3)while語句
4)for語句
5)for-in語句:用於枚舉對象的屬性,for (property in expression) statement
6)lable語句:在代碼中添加標簽
7)break和continue語句
8)with語句:將代碼的作用域設置到一個特定的對象中
9)switch語句:
switch (expression) {
case value: statement
break;
case value: statement
break;
case value: statement
break;
case value: statement
break;
default: statement
}
7、函數
1)參數:在函數體內可以通過 arguments 對象來訪問這個參數數組,從而獲取傳遞給函數的每一個參數; arguments 對象的長度是由傳入的參數個數決定的,不是由定義函數時的命名參數的個數決定的。
2)沒有重載:如果在 ECMAScript中定義了兩個名字相同的函數,則該名字只屬於後定義的函數。
第四章 變量、作用域和內存問題
1、基本類型和引用類型的值
1)動態的屬性
2)復制變量值:當從一個變量向另一個變量復制引用類型的值時,同樣也會將存儲在變量對象中的值復制一份放到為新變量分配的空間中。復制操作結束後,兩個變量實際上將引用同一個對象。
3)傳遞參數:參數只能按值傳遞;在向參數傳遞基本類型的值時,被傳遞的值會被復制給一個局部變量(命名參數);在向參數傳遞引用類型的值時,會把這個值在內存中的地址復制給一個局部變量。
4)檢測類型:instanceof
2、執行環境及作用域
1)全局執行環境:在Web浏覽器中,全局執行環境是window對象,因此所有全局變量和函數都是作為window對象的屬性和方法創建的
2)作用域鏈:內部環境可以通過作用域鏈訪問所有的外部環境,但外部環境不能訪問內部環境中的任何變量和函數。局部環境開始時會先在自己的變量對象中搜索變量和函數名,如果搜索不到則再搜索上一級作用域鏈。
3)延長作用域鏈:try-catch語句的catch塊、witch語句
4)沒有塊級作用域
3、垃圾收集
1)標記清除:垃圾收集器在運行的時候會給存儲在內存中的所有變量都加上標記,然後它會去掉環境中的變量以及被環境中的變量引用的變量的標記,而在此之後再被加上標記的變量將被視為准備刪除的變量原因是環境中的變量已經無法訪問到這些變量了。
2)引用計數:當聲明了一個變量並將一個引用類型值賦給該變量時,則這個值的引用次數加1;如果同一個值又被賦給另一個變量,則該值的引用次數減1。
3)性能問題:如果垃圾收集例程回收的內存分配量低於15%,則變量、字面量和(或)數組元素的臨界值加倍;如果例程回收了85%的內存分配量,則將各種臨界值重置為默認值。
4)管理內存:解除引用