以下內(nèi)容可能存在個人理解的部分,并非完全參照原文
如有疑問,請以書中內(nèi)容為準
第一章 JavaScript簡介
這里需要注意的是JavaScript不等同于ECMAScript,JavaScript包含ECMAScript、DOM和BOM
另外DOM也不是JavaScript專有的,也有其他語言實現(xiàn)了DOM(QML好像就是類似DOM的實現(xiàn))
第二章 在HTML中使用JavaScript
把JavaScript插入到HTML中需要用到<script>元素
這里需要注意的要點有:
- 所有
<script>元素會根據(jù)它們在html文件中的先后順序依次被解析。如果引用多個JavaScript文件時要注意它們之間的依賴關系 - 在
<script>中使用defer屬性的腳本會被延遲到整個頁面都解析完畢再運行(即先下載后運行) - 使用async屬性可以讓腳本使當前腳本不必等待其他腳本,也不必阻塞文檔呈現(xiàn),一旦腳本可用,就會異步執(zhí)行,但不能保證執(zhí)行順序
- 如果不適用defer和async可以將
<script>元素放到頁面最后,即</body>標簽前面,這樣也可以使腳本在頁面加載后解析運行
在現(xiàn)實當中延遲腳本不一定會按順序執(zhí)行,所以最好只包含一個延遲腳本
可以使用
<noscript>在不支持腳本的瀏覽器中使用代替的內(nèi)容,在啟用了腳本的情況下,瀏覽器不會顯示<noscript>中的內(nèi)容
第三章 基本概念
這一章內(nèi)容很多很雜
3.1 語法
ECMAScript的語法大量借鑒了C以及其他類C語言,而且ECMAScript比它們更加寬松。
ECMAScript中的一切都區(qū)分大小寫
3.2 關鍵字和保留字
debugger是ES5新增的關鍵字
ES6之后使用了let、class、import、const、super、extends,這些在ES5都是保留字
3.3 變量
ECMAScript中的變量可以保存任何類型的數(shù)據(jù)。
聲明但未初始化的變量會保存一個特殊的值——undefined
var msg;
console.log(msg); // undefined
注意,用var定義的變量將成為定義該變量作用域中的局部變量
如果在函數(shù)內(nèi)使用var定義一個變量,這個變量在函數(shù)退出后就會被銷毀
function test(){
var msg = 'test';
}
test();
alert(msg); //error
3.4 數(shù)據(jù)類型
ECMAScript中有5種簡單數(shù)據(jù)類型(基本數(shù)據(jù)類型):Undefined、Null、Boolean、Number、String
還有一種復雜數(shù)據(jù)類型——Object
注意
Object是復雜數(shù)據(jù)類型而不是簡單數(shù)據(jù)類型
ECMAScript不支持自定義類型,所有值都是上面6種類型之一
使用typeof操作符可以檢測變量的數(shù)據(jù)類型,并返回一個字符串:
-
"undefined"——如果這個值未定義 -
"boolean"——如果這個值是布爾值 -
"string"——如果這個值是字符串 -
"number"——如果這個值是數(shù)值 -
"object"——如果這個值是對象或null -
"function"——如果這個值是函數(shù)
typeof是操作符而不是函數(shù),因此可以使用typeof(msg)也可以使用typeof msg
typeof null會返回"object",因為null會被認為是一個空的對象引用
正則表達式現(xiàn)在會返回"object"
從技術角度講,函數(shù)在ECMAScript中是對象不是數(shù)據(jù)類型,然而為了區(qū)分函數(shù)和其他對象,因此讓
typeof操作符返回"function"
Undefined
Undefined類型只有一個值,就是undefined
不需要顯示地把一個變量初始化為undefined,雖然我感覺沒人這么傻
對于未聲明的變量和未初始化的變量,typeof都會返回"undefined"
顯示地初始化變量便可以使用
typeof來判斷變量是否被聲明
Null
Null類型也只有一個值,這個值為null
undefined值派生自null,因此會出現(xiàn)比較奇怪的情況
alert(null == undefined); //true
用嚴格等可以將它們區(qū)分開
alert(null === undefined); //false
推薦將準備保存對象的變量初始化為
null
Boolean
Boolean類型的字面值true和false是區(qū)分大小寫的,True和False不是Boolean值
可以調(diào)用函數(shù)Boolean()將其他值轉(zhuǎn)換為Boolean類型,轉(zhuǎn)換規(guī)則:
| 數(shù)據(jù)類型 | 轉(zhuǎn)換為true | 轉(zhuǎn)換為false |
|---|---|---|
| string | 任何非空字符串 | ""(空字符串) |
| Number | 任何非零數(shù)值(包括無窮大) | 0和NaN |
| Object | 任何對象 | null |
| Undefined | 不存在 | undefined |
Number
除了以十進制表示,整數(shù)還可以通過八進制或十六進制的字面值來表示
其中八進制第一位必須是0,如果字面值中的數(shù)值超過了范圍,該值將被當作十進制數(shù)值解析
var octalNum1 = 070; // 八進制的56
var octalNum2 = 079; // 無效 解析為79
var octalNum3 = 08; // 無效 解析為8
十六進制前兩位必須為0x,字母A~F可以大寫也可以小寫
var hexNum1 = 0xA; // 十六進制的10
var hexNum2 = 0x1f; // 十六進制的31
在進行計算時,所有八進制和十六進制的數(shù)值最終都會被轉(zhuǎn)換成十進制
八進制字面量在嚴格模式下會報錯
浮點數(shù)小數(shù)點前面可以沒有整數(shù),但不推薦
var floatNum = .1; //有效,但不推薦
由于保存浮點數(shù)值需要的內(nèi)存空間是保存整數(shù)的兩倍,ECMAScript會盡量將浮點數(shù)轉(zhuǎn)換為整數(shù)
var floatNum1 = 1.; // 小數(shù)點后沒有數(shù)字 解析為1
var floatNum2 = 10.0; // 整數(shù) 解析為10
可以使用e表示法(科學計數(shù)法),e可以大寫也可以小寫
var floatNum = 1.125e7; // 等于11250000
浮點數(shù)的最高精度是17位小數(shù),但在計算時其精度遠遠不如整數(shù)
例如,0.1+0.2的結果不是0.3而是0.30000000000000004
if (a + b == 0.3){ // 不要這么做
alert("a+b=0.3");
}
永遠不要測試某個特定的浮點數(shù)值
ECMAScipt中的最小值保存在Number.MIN_VALUE中,在大多數(shù)瀏覽器中為5e-324
最大值保存在Number.MAX_VALUE中,在大多數(shù)瀏覽器中為1.7976931348623157e+308
如果某個數(shù)超出JavaScript數(shù)值范圍,這個數(shù)將被轉(zhuǎn)換成Infinity,負數(shù)轉(zhuǎn)換成-Infinity
可以使用isFinity來確定一個數(shù)是不是有窮的
alert(isFinite(Number.MAX_VALUE + Number.MAX_VALUE)); // false
訪問
Number.NEGATIVE_INFINITY和Number.POSITIVE_INFINITY也可以得到負和正的Infinity
NaN(Not a Number)是一個特殊的數(shù)值,表示本來要返回數(shù)值的操作數(shù)未返回數(shù)值的情況(不會拋出錯誤)
NaN有兩個特點:
- 任何涉及
NaN的操作都會返回NaN -
NaN與任何值都不想等,包括NaN本身
isNaN()函數(shù)可以幫我們確定一個數(shù)是否“不是數(shù)值”,非數(shù)值類型會先轉(zhuǎn)換為數(shù)值類型再判定
alert(isNaN(10)); // false
alert(isNaN("10")); // false
alert(isNaN("blue")); // true(不能轉(zhuǎn)換為數(shù)值)
alert(isNaN(true)); // false
有三個函數(shù)可以把非數(shù)值轉(zhuǎn)換為數(shù)值:Number()、parseInt()和parseFloat()
Number()在轉(zhuǎn)換字符串時比較復雜而且不夠合理,因此在處理整數(shù)時常用的是parseInt()函數(shù)
var num1 = Number("hello"); // NaN
var num2 = Number("66hello"); // NaN
var num3 = Number("070"); // 70
var num4 = Number(""); // 0
var num5 = Number("0xA"); // 10 解析為16進制
var num6 = parseInt("hello"); // NaN
var num7 = parseInt("66hello"); // 66
var num8 = parseInt("070"); // 70 ES3會理解為8進制,ES5之后會忽略前導0解析為10進制
var num9 = parseInt(""); // NaN
var num10 = parseInt(22.5); // 22
var num11 = parseInt("0xA"); // 10
為了消除parseInt()函數(shù)可能導致的困惑,可以提供第二個參數(shù),指定轉(zhuǎn)換使用的基數(shù)(即多少進制)
var num1 = parseInt("0xAF", 16); // 175
var num2 = parseInt("AF", 16); // 175
var num3 = parseInt("AF"); // NaN
推薦在任何時候都指定轉(zhuǎn)換使用的基數(shù),一般情況下為10
而parseFloat()會始終忽略前導0
var num1 = parseFloat("1234blue"); // 1234
var num2 = parseFloat("0xA"); // 10
var num3 = parseFloat("22.5"); // 22.5
var num3 = parseFloat("22.34.5"); // 22.34
var num3 = parseFloat("0908.5"); // 908.5
var num3 = parseFloat("3.125e7"); // 31250000
能解析為整數(shù)的數(shù)parseFloat()會返回整數(shù)
String
字符串可以用雙引號""可以用單引號''表示
ECMAScript中的字符串是不可變的,一旦創(chuàng)建值就不能改變
如果要改變某個變量保存的字符串,要先銷毀原來的字符串,然后再用一個包含新值的字符串填充該變量
var lang = "Java";
lang = lang + "Script";
在實現(xiàn)第二行代碼時,操作過程如下:
- 首先創(chuàng)建一個能容納10個字符的新字符串
- 然后在這個字符串中填充"Java"和"Script"
- 銷毀原來的字符串"Java"和字符串"Script"
可以使用toString()方法來把一個值轉(zhuǎn)換為字符串
var age = 11;
var ageString = age.toString(); // "11"
var found = true;
var foundAsString = found.toString(); // "true"
null和undefined沒有toString()方法
再調(diào)用數(shù)值的toString()方法時可以傳入一個參數(shù)來決定輸出數(shù)值的基數(shù)
如果值可能是null和undefined,還可以使用String()函數(shù)
- 如果值有
toString()方法則使用該方法 - 如果是
null則返回"null" - 如果是
undefined則返回"undefined"
Object
對象可以通過執(zhí)行new操作符后跟要創(chuàng)建的對象類型的名稱來創(chuàng)建
在ECMAScript中,Object類型是所有其它實例的基礎,即Object類型具有的方法和屬性也同樣存在于更具體的對象中
Object的每個實例都具有下列屬性和方法:
-
constructor:保存著構造函數(shù) -
hasOwnProperty(propertyName):檢查屬性在當前對象實例(而不是原型)中是否存在 -
isPrototypeOf(object):檢查傳入的對象是否為當前對象的原型 -
propertyIsEnumerable(propertyName):檢查給定的屬性是否能使用for-in語句枚舉 -
toLocaleString():返回對象的字符串表示,該字符串與執(zhí)行環(huán)境的地區(qū)對應 -
toString():返回對象的字符串 -
valueOf():返回對象的字符串、數(shù)值或布爾值表示,通常與toString()方法的返回值相同
ECMA-262中對象的行為不一定適用于JavaScript中的其他對象,比如BOM和DOM都屬于瀏覽器中的宿主對象,不一定繼承Object
第三章還有一些東西 留到下次再整理