第1章 JavaScript簡(jiǎn)介
1.2 JavaScript實(shí)現(xiàn)
DOM級(jí)別
DOM0,實(shí)際不存在,指的是Internet explorer4.0和Netscape navigator4.0最初支持的DHTML。
DOM1,DOM核心和DOM HTML。
DOM2夭苗,擴(kuò)充鼠標(biāo)、用戶界面事件隔缀、范圍题造、歷遍、CSS支持猾瘸。
DOM3晌梨,引入以統(tǒng)一方式加載和保存文檔的方法桥嗤,新增驗(yàn)證文檔方法DOM驗(yàn)證,DOM核心擴(kuò)展等仔蝌。
第2章 在HTML中使用JavaScript
2.1 <script>元素
charset,指定的代碼字符集荒吏,大多數(shù)瀏覽器會(huì)忽略它的值敛惊。
defer,延遲到文檔完全被解析和顯示之后再執(zhí)行绰更。但在現(xiàn)實(shí)中瞧挤,多個(gè)延遲腳本不一定會(huì)按照順序執(zhí)行,建議只包含一個(gè)延遲腳本儡湾。HTML5會(huì)忽略該屬性特恬。
async,立即下載腳本徐钠。目的是不讓頁(yè)面等待兩個(gè)腳本下載和執(zhí)行癌刽。多個(gè)async腳本不一定按照他們的先后順序執(zhí)行,確保async腳本之間互不依賴尝丐。
瀏覽器會(huì)按照<script>出現(xiàn)的先后順序依次解析显拜。
2.4 <noscript>元素
<noscript>用于在不支持JavaScript的瀏覽器中顯示替代內(nèi)容。
第3章 基本概念
3.4 數(shù)據(jù)類型
typeof是一個(gè)操作符而不是函數(shù)爹袁,因此typeof()加圓括號(hào)不是必須的远荠。
typeof null返回object,因?yàn)閚ull被認(rèn)為是一個(gè)空的引用對(duì)象失息。null值表示一個(gè)空對(duì)象指針譬淳。
typeof 正則表達(dá)式 返回function或object。
函數(shù)是一種特殊的對(duì)象盹兢。
對(duì)于尚未初始化和沒(méi)被聲明的變量邻梆,typeof都會(huì)返回undefined。
只要保存對(duì)象的變量還沒(méi)有真正保存對(duì)象時(shí)蛤迎,就應(yīng)該明確讓該變量保存null值确虱。
null==undefined返回true,因?yàn)閡ndefined值是派生自null值的替裆。
if(Boolean(message))與if(message)等價(jià)校辩,false、""(空字符串)辆童、0宜咒、NaN、bull把鉴、undefined的布爾值都為false故黑。
八進(jìn)制字面值第一位必須是0儿咱,然后是八進(jìn)制數(shù)字序列0-7,如果字面值超出范圍场晶,前導(dǎo)0將忽略混埠,后面數(shù)值被當(dāng)做十進(jìn)制數(shù)值解析。如
onum1=070;//八進(jìn)制56
onum2=079;//十進(jìn)制79
onum3=08;//十進(jìn)制8
在進(jìn)行算數(shù)計(jì)算時(shí)诗轻,所有八進(jìn)制和十六進(jìn)制數(shù)值都將轉(zhuǎn)換為十進(jìn)制數(shù)值钳宪。
保存浮點(diǎn)數(shù)值需要的內(nèi)存空間是保存整數(shù)值的2倍。
浮點(diǎn)數(shù)值最高精度是17位小數(shù)扳炬,但在計(jì)算時(shí)不能測(cè)試特定的浮點(diǎn)數(shù)吏颖。如a+b==0.3將得不到準(zhǔn)確結(jié)果,因?yàn)?.1+0.2結(jié)果是0.30000000000000004恨樟。這是IEEE754數(shù)值浮點(diǎn)計(jì)算的通病半醉。
瀏覽器最小數(shù)值Number.MIN_VALUE=5e-324,最大數(shù)值Number.MAX_VALUE=1.7976931348623157e+308劝术。
超出范圍的值將自動(dòng)轉(zhuǎn)換為Infinity(無(wú)窮)缩多。Number.NEGATIVE_INFINITY=-Infinity,Number.POSITIVE_INFINITY=Infinity夯尽。
isFinite()函數(shù)判斷數(shù)值是否是有窮的瞧壮,返回布爾值。
NaN匙握,非數(shù)值咆槽,number/0=NaN。涉及NaN的操作都會(huì)返回NaN圈纺,且NaN==NaN返回false秦忿。
isNaN()函數(shù)判斷是否“不是數(shù)值”。如isNaN(NaN)返回true蛾娶,isNaN("blue")返回true灯谣,isNaN(true)返回false(可以被轉(zhuǎn)為數(shù)值1),isNaN(false)返回false(可以被轉(zhuǎn)為數(shù)值0)蛔琅。
轉(zhuǎn)型函數(shù)Number()可用于任何數(shù)據(jù)類型胎许,parseInt()、parseFloat()用于把字符串轉(zhuǎn)換成數(shù)值罗售。
Number("")返回0辜窑,parseInt("")返回NaN。
parseInt("070")在ES3中解析為56(八進(jìn)制)寨躁,ES5中parseInt()已不具有解析八進(jìn)制的能力穆碎,因此為解析為0≈翱遥可指定基數(shù)parseInt("070"所禀,8)確保按八進(jìn)制解析方面。
parseFloat()只能解析十進(jìn)制,從第一個(gè)字符解析到遇見(jiàn)第一個(gè)無(wú)效的浮點(diǎn)數(shù)字字符為止色徘。
若字符串中包含雙音節(jié)字符恭金,length屬性可能不會(huì)精確的返回字符串中的字符數(shù)目。(why贺氓?)
toString()可以將數(shù)值蔚叨、布爾值、對(duì)象和字符串值轉(zhuǎn)換為字符串辙培。但是null和undefined沒(méi)有這個(gè)方法。如toString(10)返回"10"(字符串)邢锯。
Srting()能夠?qū)⑷魏晤愋娃D(zhuǎn)換為字符串扬蕊。如Srting(null)返回"null"。
3.5 操作符
一元加和減操作符主要用于基本算數(shù)運(yùn)算丹擎,或者用于轉(zhuǎn)換數(shù)據(jù)類型尾抑,即將非數(shù)值轉(zhuǎn)換為數(shù)值(包括NaN)。
&&(邏輯或)是短路操作符蒂培,即如果第一個(gè)操作符求值結(jié)果為true再愈,就不會(huì)對(duì)第二個(gè)操作數(shù)求值了,可以利用這一行為避免為變量賦null或undefined值护戳。
加法操作符翎冲,如果有一個(gè)操作數(shù)是字符串時(shí),則將另一個(gè)操作數(shù)轉(zhuǎn)換為字符串媳荒,再拼接起來(lái)抗悍。如
var message=‘blue’+3+5;//結(jié)果是blue35。
比較兩個(gè)字符串時(shí)钳枕,實(shí)際是比較兩個(gè)字符串對(duì)應(yīng)位置的每個(gè)字符的字符編碼值缴渊,因此’Blue’<apple返回true。因?yàn)榇髮懽帜傅淖址幋a全部小于小寫字母鱼炒。
任何操作數(shù)與NaN比較時(shí)結(jié)果都是false衔沼。
==(相等)和!=(不相等),先將對(duì)象轉(zhuǎn)換成相似的類型昔瞧,再比較指蚁。NaN==NaN返回false,NaN硬爆!=NaN欣舵,返回true。null==undefined返回true缀磕。
===(全等)和!==(不全等)缘圈,僅比較不轉(zhuǎn)換劣光。NaN===NaN返回false。null==undefined返回false(因?yàn)椴皇峭愋停?/p>
逗號(hào)操作符賦值時(shí)糟把,返回表達(dá)式最后一項(xiàng)绢涡。如
var a=(1,2,3);//a結(jié)果為3
3.6 語(yǔ)句
不存在塊級(jí)作用域,因此在循環(huán)內(nèi)部定義的變量也可以在外部環(huán)境訪問(wèn)到遣疯。
for-in語(yǔ)句用來(lái)枚舉對(duì)象的屬性雄可。
使用label標(biāo)簽的嵌套循環(huán)中有continue,會(huì)跳出內(nèi)循環(huán)繼續(xù)執(zhí)行外循環(huán)中的語(yǔ)句缠犀。如
num=0;
outermost:for(i=0;i<10;i++){
for(j=0;j<10;j++){
if(i==5&&j==5){
continue outermost;
}num++;
}
}
//num結(jié)果為95
不使用label標(biāo)簽的嵌套循環(huán)中有break数苫,會(huì)跳出內(nèi)循環(huán),從頭執(zhí)行外循環(huán)辨液。如
num=0;
for(i=0;i<10;i++){
for(j=0;j<10;j++){
if(i==5&&j==5){
break;
}
num++;
}
}
//num結(jié)果為94虐急。
switch語(yǔ)句中可以使用任何類型,比較值時(shí)使用的是全等操作符滔迈。
3.7 函數(shù)
定義兩個(gè)同名函數(shù)止吁,位于后面的會(huì)覆蓋前面的。
arguments對(duì)象可以訪問(wèn)傳入函數(shù)的參數(shù)燎悍。如arguments[0]的值是函數(shù)的第一個(gè)參數(shù)的值敬惦。arguments與參數(shù)值是同步的,但內(nèi)存空間是獨(dú)立的谈山。
第4章 變量俄删、作用域和內(nèi)存問(wèn)題
4.1 基本類型和引用類型的值
操作對(duì)象時(shí)實(shí)際上是在操作對(duì)象的引用而不是實(shí)際的對(duì)象。
不能給基本類型的值添加屬性勾哩。
從一個(gè)對(duì)象向另一個(gè)對(duì)象復(fù)制基本類型的值時(shí)抗蠢,會(huì)在變量對(duì)象上創(chuàng)建一個(gè)新值,然后把該值復(fù)制到為新變量分配到位置上思劳。
從一個(gè)變量向另一個(gè)變量復(fù)制引用類型的值時(shí)迅矛,同樣也會(huì)將存儲(chǔ)在變量對(duì)象中的值復(fù)制一份放到為新變量準(zhǔn)備的空間中。但是這個(gè)值的副本實(shí)際上是個(gè)指針潜叛。復(fù)制結(jié)束后兩個(gè)變量實(shí)際上引用同一個(gè)對(duì)象秽褒。
參數(shù)只能按值傳遞。
instanceof()威兜,檢測(cè)引用類型的值销斟。如果變量是給定引用類型(有Object、Array椒舵、RegExp等)蚂踊,返回true。如person instanceof Object如果person是對(duì)象返回true笔宿。
ESCA-262規(guī)定任何在內(nèi)部實(shí)現(xiàn)[[Call]]方法的對(duì)象都應(yīng)該在應(yīng)用typeof時(shí)返回function犁钟。因此typeof 正則表達(dá)式 返回function棱诱,在IE和Firefox中,返回object涝动。
4.2 執(zhí)行環(huán)境及作用域
每個(gè)環(huán)節(jié)都可以向上搜索作用域鏈迈勋,以查詢變量和函數(shù)名;但任何環(huán)境都不能通過(guò)向下搜索作用域鏈而進(jìn)入另一個(gè)執(zhí)行環(huán)境醋粟。
try-catch語(yǔ)句的catch塊和with語(yǔ)句可以延長(zhǎng)作用域靡菇,在作用域鏈的前端臨時(shí)增加一個(gè)變量對(duì)象,該對(duì)象會(huì)在代碼執(zhí)行后被移除米愿。
p75 4.2.1中url作用域被延長(zhǎng)厦凤?(why?)
4.3 垃圾收集
解除引用育苟,一旦數(shù)據(jù)不再有用泳唠,最好通過(guò)將其值設(shè)置為null來(lái)釋放其引用。