1、JavaScript簡介算法
一、ECMAScript編程
1995~今已經20年的歷史,產生JavaScript是須要它去解決必定的問題:在瀏覽器端作一些數據的驗證,試想當年的網絡環境,若是可以在瀏覽器端作數據驗證可以方便不少。現在的JavaScript擁有了閉包、匿名函數、甚至元編程的能力。一門可以解決棘手問題的新語言的誕生一定有很廣闊的市場,有市場就會有競爭,競爭逐漸演化爲標準也就是ECMAScript、它定義了一門腳本語言的標準,在此基礎上加入DOM,BOM的支持構成了現在的JavaScript。數組
二、 DOM(Document Object Model)瀏覽器
DOM是一個編程接口,操做的對象是基於XML的HTML(HTML元素的容器)結構。安全
DOM將一個HTML文件表示成一個分層樹形圖,藉助DOM提供的API,開發人員能夠很方便的增、刪、改、查HTML文件節點網絡
DOM由兩部分構成:DOM Core和DOM HTML 前者用於描述HTML結構,後者用於提供一些操做,是否是很符合數據結構+算法的思想。數據結構
三、 BOM(Browser Object Model)閉包
BOM是一個描述瀏覽器窗口的對象模型。好比窗口大小,分辨率,location,這些都是屬於瀏覽器窗口的信息,跟DOM沒有關係,同時也提供了和瀏覽器交互的方法和接口。函數
2、在HTML中使用JavaScript測試
在HTML代碼中使用<script></script>標籤將JavaScript代碼嵌入HTML文件中,包含在這個標籤裏的JavaScript代碼從上到下依次解釋。
能夠經過這個標籤的src屬性連接外部的JavaScript文件,也能夠在這個標籤中間直接寫JavaScript代碼。不可以在一個script標籤中即便用src屬性連接外部文件又使用內嵌的方式寫入JavaScript代碼,若是這樣寫內嵌的代碼將被忽略。
3、基本概念
一、 嚴格模式:爲JavaScript定義了一種不一樣的解析和執行模型,在嚴格模式下ECMAScript3中一些不肯定的行爲將獲得處理,並且某些不安全的操做也會跑出錯誤。要在腳本中啓用嚴格模式,能夠在頂部添加以下代碼
「use strict」;
二、 變量
每一個變量僅僅是一個用於保存值的佔位符而已 :var xxxx;//(xxxx是變量名),
注意:
①、此處僅僅是定義了變量xxxx單未給變量初始化,此時xxxx會保存一個特殊的值:undefined
②、使用var操做符定義的變量將成爲定義該變量做用域中的局部變量,這是相對於全局變量來說的,若是不適用var而直接給一個未聲明過的變量賦值,那麼當這個變量定義語句執行事後這個變量將成爲全局變量。未經聲明的變量賦值在嚴格模式下會致使拋出ReferenceError錯誤。
三、 數據類型
① ECMAScript定義了5中簡單的數據類型(基本數據類型)
a) Undefined
很是神奇的一種數據類型,其餘語言中沒見過,這種類型只有一個值即:undefined。如上所述在使用var聲明變量但未對其加以初始化時,這個變量的值就是undefined。
b) Null
這也是一個很是神奇的類型,只有一個值null,標識一個空對象的指針。通常若是定義的變量是要用來保存對象的,那麼最好在初始化的時候將它初始化爲null值,這樣一來在之後用到該變量的時候只須要直接檢查該變量是否爲null值就能夠知道相應的變量是否已經保存了一個對象的引用。
Var car=null;
Alert(Type of car) //Object;
……;
If(car != null){
//對car對象執行某些操做
}
又一枚神奇的定義:undefined派生自null
Alert(null == undefined); //true
c) Boolean
只有兩個值true、false;
全部類型的值都有與這兩個值等價的值,可使用Boolean(變量名)來轉換。
d) Number
NaN值,Not a Number
任何數除0都會返回NaN,NaN與任何值都不相等包括NaN自己
e) String
② 1中複雜的數據類型
Object,本質上是由一組無序的名值對組成
建立自定義對象的方式是建立Object類型的實例併爲其添加屬性和方法。基本類型不具備這個特性。
Var person = new Object();//定義一個person對象
Person.name=’helloworl~~~’;//爲person對象添加一個name屬性
Alert(person.name);// helloworl~~~
不支持任何建立自定義類型的機制,全部值最終都將是上述6種數據類型之一。 經過typeof操做符能夠識別變量的類型,函數在ECMAScript中是對象,不是一種數據類型,然而函數有一些特殊的屬性,所以經過typeof操做符來區分函數和其餘對象是有必要的。
四、 函數
① 、無須制定函數的返回值,由於任何ECMAScript函數均可以在任什麼時候候返回任何值。
② 實際上、未指定返回值的函數返回的是一個特殊的undefined值。
③ ECMAScript中也沒有函數簽名的概念,由於其函數參數是以一個包含零活多個值得數組的形式傳遞的。
④ 能夠向ECMAScript函數傳遞任意數量的參數,而且能夠經過arguments對象來訪問這些參數。
⑤ 因爲不存在函數簽名的特性,ECMAScript函數不能重載。
五、 變量的類型檢測
① 、Typeof 操做符,注意這是一個一元操做符,它用來檢測變量的類型
Var a=true;
Var b;
Var c=null;
Var d = new Object();
Alert(typeof a);// 輸出:boolean
Alert(typeof b);// 輸出:undefined
Alert(typeof c);// 輸出:object
Alert(typeof d);// 輸出:object
② Instanceof 操做符,是一個二元操做符,測試一個對象是否是另外一個對象的實例,返回ture false。
Alert(person instanceof Object);//變量person是Object嗎?
Alert(colors instanceof Array);//變量colors是Array嗎?
Alert(pattern instanceof RegExp);//變量pattern是RegExp嗎?
在檢測基本數據類型時typeof很好用,可是在檢測引用類型的變量時,這個操做符的用處不大,由於它只會返回object或function。一般咱們並不想知道某個值時對象,而是想知道它是什麼類型的對象,這個時候用instanceof操做符就能夠實現此目的。
六、 做用域
JavaScript中沒有塊級做用域,於是支持根據條件來定義變量。在其餘類C的語言中,由花括號封閉的代碼都有本身的做用域。
If(true){
Var color=’blue’;
}
Alert(color); //’blue’
七、 垃圾收集
JavaScript具備自動垃圾收集機制,也就是說,執行環境會負責管理代碼執行過程當中使用的內存。垃圾收集機制的原理簡單的講就是找出那些不在繼續使用的變量,而後釋放其所佔用的內存。通常都是週期性的執行這一操做,固然也能夠主動調用。
找程序中的無用變量的策略可能會由於實現而異,一般有以下兩個策略:
①、 標記清除:當變量進入環境時,就將這個變量標記爲「進入環境」。從邏輯上將,永遠不能釋放進入環境的變量所佔用的內存,由於只要執行流進入相應的環境,就可能用到他們。而當變量離開環境時,則將其標記爲「離開環境」。垃圾收集器完成清除離開環境的對象內存的工做。
②、 引用計數(不太常見):跟蹤每一個值被引用的次數,當聲明瞭一個變量並將一個引用類型的值賦給該變量時,則這個值得引用次數就是1,若是同一個值又被賦給另外一個變量,則該值得引用次數加1.相反,若是包含對這個值引用的變量又取得另一個值,則這個值得引用次數減1,當這個值得引用次數變成0時,則說明沒有辦法再訪問這個值了,於是就能夠將其佔用的內存空間回收回來。
優化內存佔用的最佳方式,就是爲執行中的代碼只保存必要的數據,一旦數據不在有用,最好經過將其值設置爲null來釋放其引用。這個作法叫作解除引用。這一作法使用於大多數全局變量和全局對象的屬性。局部變量會在他們離開執行環境時自動被解除引用。注意:解除一個值得引用並不意味着自動回收該值所佔用的內存。解除引用的真正做用是讓值脫離執行環境,以便垃圾收集器下次運行時將其回收。
本文系我的讀書總結,轉載請註明出處