標籤:
第二章 在HTML中使用JS
載入JS有三種:行內,head頭部和外部連結JS 最好使用外部連結<script src="example.js" ></script>(推薦),在script標籤中不需要放任何代碼,放了也會被忽略。也可以使用<script src="example.js" /> 但是文法不符合HTML規範 所以不要這樣寫。
在傳統做法中,script放在head中,但是會等到載入完JS再執行DOM,頁面會延遲和遇到影響執行條件的語句,所以可以用defer,async設定屬性 和window.onload來順延強制,defer,async屬性只適用於外部指令碼,標記為async的指令碼不一定回按照指定他們的先後順序執行,現在web應用程式一般把全部的JS引用放在body元素中頁面內容的後面。 <body>………………<script src="##"></script></body>。在不支援JS的瀏覽器中加入<noscript>內容</noscript>,可是在給在瀏覽器上顯示提示內容
使用外部連結JS代碼的優點: 可維護性 可緩衝 適應未來。
第三章 基本概念
1.ECMAScript中的一切都區分大小寫。
2.標識符的第一個字元必須是字母、底線或$,其後可以試字母、底線、貨幣符號、或數字。標識符採用駝峰大小寫格式(第一個字母小寫,剩下的每個單詞的首字母大寫),不得使用關鍵字和保留字
3.注釋 單行注釋 //注釋內容 多行注釋/*內容*/
4.語句一一個分號結尾。沒有分號也是可以的,但是為了程式的長遠考慮,要求必須在語句的結尾加上分號。
5。ES中變數是鬆散類型的,可以儲存任意資料類型。var定義的變數是定義該變數的範圍中的局部變數。如果沒有用var就為全域變數,全域變數是魔鬼,一定要避免。,
6.ES中有5種單一資料型別:Undefined、Null、Boolean、Number、String和一個複雜的資料類型Object,typeof操作符可以用來檢測基本類型資料。typeof null會返回object,因為null被認為是一個空的對象的引用。
7.使用var聲明變數但是沒有初始化,其值為undefined。但是未定義的變數的值與undefined的值是不一樣的。使用未定義的變數會為not defined,但是用typeof檢測的時候他們的值是相等的,
var a; alert(typeof a);//undefined alert(typeof b); //undefined
8.Null的值表示一個Null 物件指標,如果定義的變數準備用於儲存對象,則最好將該值賦值為null。實際上undefined是派生與null的 用typeof檢測的時候兩個值相等。
9.Booloean類型的字面值是true和false (區分大小寫),True 和False則為普通 的標識符,對任意資料調用Boolean()函數總會返回一個布爾值。其中 false 、""(Null 字元串)、0和NaN、 null undefined在轉為布爾值的時候是false
10.Number類型不區分整數與浮點數,認識八進位、十進位和十六進位、預設為十進位。小數點前面可以沒有整數但是不推薦使用,由於浮點數佔用記憶體是整數的兩倍,所以ES會將資料值盡量轉換為整數。數值範圍在Number.MIN_VALUE到Number.MAX_VALUE之間,其他的為正無窮或者負無窮(=- Infinity),可以用isFinity( num )函數來檢測num是否是有窮數
11.NaN(Not a number)用於表示一個不是數值的值。 任何值除以0返回NaN,(實際上只有0/0的時候返回NaN,正數除以0得Infinity,負數除以0得-Infinity)任何涉及NaN的操作用都會返回NaN,並且不與任何值相等,包括本身、可以用isNaN(num) 來確定參數是否“不是數值”。
12.ES中有3個函數可以把非數值轉換為數值:Number(),parseInt(),parseFloat().
Number()可以用於任何資料類型,另外兩個函數用於講字串轉換為數值。Number()轉換undefined值的數位以後返回NaN,忽略前置0;可以轉換十六進位,如果是對象,依次調用valueOf(),toString()直到得出數值。Number()轉換的時候比較複雜且不合理,所以經常用parseInt()和parseFloat().
parseInt()忽略前面的空格,直到找到非空白字元串,如果第一個字元不是數字或者符號,返回NaN。如果是數字或符號,會一直解析下去,直到不滿足要求。能識別八、十、十六進位,可以加入第二個參數作為進位數 var num = parseInt("AF",16);//175 var num = parseInt("10",2);//2
parseFloat()從第一個字元開始解析每個字元,一直解析到末尾,或者遇到一個無效的浮點數字字元為止。忽略前置0;只識別十進位。
13.String由單雙引號表示“ ”,‘’,但是左右引號必須要相同匹配。要將一個值轉換為字串有兩種方式:toString()、String()
toString()返回相應值的字串表現,null 和undefined沒有這個方法。一般不需要傳遞參數,但是可以傳遞一個參數來表示要轉換成的進位。10.toString(2);//"1010",預設為10進位
在不知道是否為null或者undefined的情況下,可以用String();null 和undefined返回null和undefined。
14.Object是一組資料和功能的集合,通過執行new操作符後跟要建立的物件類型名稱來建立,並可以為其添加屬性和方法。由於ES中一切都是基於對象的,所以Object是所有它的執行個體的基礎,Object類型所具有的任何屬性和方法也同樣存在與更具體的對象中。
constructor 儲存著用於建立當前該對象的函數(建構函式)
hasOwnProperty(propertyName) 用於檢查給定的屬性在當前對象執行個體中是否存在,property必須以字串形式指定。eg:o.hasOwnproperty("name");
isProperty(object) 檢查傳入的對象是否是傳入對象的原型(是否是原型)。
propertyIsEnumerable(propertyName)"檢查給定的屬效能否用for in來枚舉,參數必須是字串。
toLocaleString()
toString()
valueOf()返回對象的字串、數值或者布爾值表示
以上屬性是所有對象都具有這些基本的屬性和方法。
操作符+語句 (略);
15.函數是核心的概念。通過函數可以封裝任意多條語句,可以在任何地方、任何時候調用。ES通過關鍵字function來聲明,eg:
function functionName(arg0,arg1,.....,argN){
statements;
}
函數通過函數名來調用,要加上(),eg:functionName(arguments[]);不需要指定是否傳回值,但是任何時候任何地方都可以通過return 語句來現實傳回值,執行完return語句之後停止並立即退出,return語句之後的語句不會執行。return也可以不帶有傳回值,此情況下返回undefined,這種用法一般用在需要提前停止函數而又不需要傳回值的情況。推薦的做法是要麼讓函數始終都返回一個值,要麼永遠都不要傳回值,否則會給調試代碼帶來不便,
函數不在乎參數的類型和數量,原因是ES中的 參數在內部是用給一個類數組來表示的,函數體內可以通過arguments對象來訪問這個參數的數組。第一個參數為arguments[0],第二個為arguments[1]……………,可以使用arguments.length來查看參數的個數,arguments的值永遠與對應具名引數的值保持同步,而且其長度是由實際傳入參數的個數決定的,與定義函數時的具名引數無關。命名的參數只提供便利,但是不是必需的。
ES中,函數是沒有重載概念的,同名函數的後一個會覆蓋前面的一個。
第四章 變數、範圍和記憶體問題
1.ES變數分為兩種:基本類型值和參考型別值。基本類型值是指簡單的資料區段,而參考型別值指那些可能由多個值構成的對象。基本類型值在記憶體中占固定大小的空間,所以儲存在棧中,而參考型別的值是對象,儲存在堆記憶體中,指向其的指標儲存在棧中,
2.5中基礎資料型別 (Elementary Data Type):number string boolean null undefined是按值訪問的,可以操作儲存在變數中的實際的值;參考型別的值是儲存在記憶體中的對象。JS不能直接操作對象的記憶體空間,只能操作對象的引用,參考型別是按引用訪問的。
3.對於參考型別的值可以增刪屬性和方法,如果對象不被銷毀或者這個屬性/方法不會刪除,則這個屬性/方法將一直存在。但是不能給基本類型值添加屬性和方法,因為添加屬性後,在執行下一行代碼的時候這個屬性就會被立即銷毀。只能給參考型別值動態添加方法和屬性。
4.在複製變數值的時候,基本類型值會在變數對象上建立一個新值,然後把該值複製到為新變數分配的位置上。
eg: var num1 = 5; var num2 =num1;
num1和num2是完全獨立的,這兩個變數可以參與任何操作而不互相影響。
當複製參考型別的時候,同樣也會將儲存在變數對象中的值複製一份放到為新變數分配的空間中,只不過這個值是一個指向對象的指標,複製操作結束後,兩個變數實際上將引用同一個對象,其中一個變數的改變,會影響到另外一個對象。
eg: var obj1 = new Object();
var obj2 = obj1;
obj1.name = "Andy";
alert(obj2.name);//Andy
5.傳遞參數
ES中所有函數的參數都是並且只能是按值傳遞的,把實參複製給形參就和把一個變數值複製到另外一個變數一樣。在向參數傳遞基本類型的值時,被傳遞的參數會被複製給一個局部變數(就是arguments對象中的一個元素);在向參數傳遞參考型別的值時,會把這個值的記憶體中的地址複製給一個局部變數,因此這個局部變數的變化會反映到函數的外部。
function addTen(num){ //num實際上是函數的局部變數
num+=10;
return num;
}
var count = 20;
var result =addTen(count); //num = count; addTen(num);
alert(count);//20 //num和count是互相獨立的
alert(result);//30
當傳遞的參數為參考型別時: function setName(obj){
obj.name = "Andy";
}
var person = new Object(); //建立一個person對象
setName(person); //obj = person 傳遞的是指標 這個對象是按值傳遞的 但是obj也會按引用來訪問同一個對象
alert(person.name);//Andy
function setName(obj){
obj.name = "Andy";
obj = new Object(){
obj.name="zhou";
}
}
var person = new Object();
setName(person);
alert(person.name);//Andy
如果person是按引用傳遞的,那麼person就會自動修改name指標,指向zhou。這說明即使在函數的內部修改了參數的值,但是原始的引用仍然沒有改變,實際上,當在函數內部重寫obj的時候,這個變數引用的就是一個局部對象,而這個對象會函數執行完畢以後會被立即銷毀,所以無法訪問到zhou.
6.檢測操作符typeof是確實一個變數是字串、數值、布爾值還是undefined的最佳工具。通常想要知道某個值是什麼參考型別用instanceof eg: person instanceof Object//變數person是Object嗎 colors instanceof Array//color是數組對象嗎
所有的參考型別都是Object的執行個體,instanceof始終返回true 而檢測基本類型的時候始終返回false 因為基本類型不是對象
7.執行環境定義了變數或者函數有權訪問的其他資料。每個執行環境都有一個獨立的變數對象,環境中所有的變數和函數都儲存在這個對象中,這個對象無法訪問,但是解析器在處理資料的時候會在後台用到它。全域執行環境是最外圍的執行環境,在web瀏覽器中,window為全域環境。某個執行環境中的所有代碼執行完以後,該環境就會被銷毀,儲存在其中的所有變數和函數的定義也隨之銷毀。
執行環境用棧來表示,執行流進入一個函數,函數的環境就被push到環境棧中,執行完畢以後就會被POP出來,把控制權交還給之前的執行環境。
當代碼在一個環境中執行的時候,會建立變數對象的一個範圍鏈,保證對執行環境有權訪問的所有變數和函數的有序訪問。
標識符解析是沿著範圍鏈一級一級地搜尋標識符的過程,搜尋過程始終從範圍鏈前端開始,然後逐級地向後回溯。查詢標識符就是從範圍的前端開始,向上逐級查詢與給定名字匹配的標識符。如果局部環境中存在著同名標識符,就不會使用位於父環境中的標識符。訪問局部變數要比全域變數塊。
內部環境可以通過範圍鏈訪問所有的外部環境,但是外部環境不能訪問內部環境中的任何變數和函數,這是單向訪問的模式,環境之間的聯絡是線性、由次序的。
8.可以通過try-catch語句的catch塊和with語句來延長範圍鏈。
9.ES中沒有塊級範圍的概念。
eg:for(var i = 0 ; i < 10 ; i ++){ 可以看成 var i = 0;//全域變數
doSomeThing(i); for(i<10;i ++){doSomeThing(i);}
} 執行完for語句過後,i的最終值是10;
alert(i);//10 alert(i);//10
if 和for語句都沒有塊級範圍,var 聲明的變數會自動添加到最近的環境中,如果沒有用var就會自動變成全域變數。但是建議在初始設定變數之前一定要先聲明。
10.垃圾收集 JS具有自動垃圾收集機制 1.標記清除 (主流的垃圾收集演算法) 2.引用計數(容易導致循環參考)
解除引用:一旦資料不再有用,最好通過設定其值為null來釋放引用 這一做法適合大多數全域變數和全域對象的屬性。局部變數會在他們離開執行環境時自動被解除引用。解除引用的真正作用是讓值脫離執行環境,以便垃圾收集器下次運行時將其回收。
javascript進階程式設計 讀書筆記1