1、導論javascript
2、基本語法java
一、嚴格來講var a=1與a=1效果不太同樣,delete命令沒法刪除前者。編程
JavaScirpt是一種動態類型語言,也就是說,變量的類型沒有限制,能夠賦予各類類型的值。數組
JavaScript引擎的工做方式是,先解析代碼,獲取全部被聲明的變量,而後再一行一行地運行。中文是合法的標識符,能夠用做變量名。瀏覽器
switch語句後面的表達式與case語句後面的表示式,在比較運行結果時,採用的是嚴格相等運算符(===
)。swidth結構不利於代碼重用,每每能夠用對象形式重寫。緩存
do...while語句中,while後的分號不能省略。服務器
typeof(null)=='object',typeof(undefined)=='undefined',null==undefined,null轉數值是0,undefined轉數值是NaN。
二、JavaScript內部,全部數字都是以64位浮點數形式儲存,cookie
+0===-0,惟一有區別的場合是,+0
或-0
看成分母,返回的值是不相等的,0/0返回NaN,NaN類型number,NaN===NaN爲false。isFinite函數返回一個布爾值,檢查某個值是否是正常數值,而不是Infinite。session
三、Base64是一種編碼方法,能夠將任意字符轉成可打印字符。使用這種編碼方法,主要不是爲了加密,而是爲了避免出現特殊字符,簡化程序的處理。btoa():字符串或二進制值轉爲Base64編碼,atob():Base64編碼轉爲原來的編碼。要將非ASCII碼字符轉爲Base64編碼,必須中間插入一個轉碼環節encodeURIComponent(str),再使用這兩個方法。閉包
四、對象中鍵名不符合標識名的條件,則必須加上引號。JavaScript的保留字能夠不加引號看成鍵名。
若是不一樣的變量名指向同一個對象,那麼它們都是這個對象的引用,也就是說指向同一個內存地址。修改其中一個變量,會影響到其餘全部變量。可是,這種引用只侷限於對象,對於原始類型的數據則是傳值引用,也就是說,都是值的拷貝。
檢查變量是否聲明:if('a' in window){}else{}。
查看全部屬性:Object.keys(o)。
delete命令只能刪除對象自己的屬性,沒法刪除繼承的屬性,不能刪除var
命令聲明的變量,只能用來刪除屬性。
with的做用是操做同一個對象的多個屬性時,提供一些書寫的方便。
五、任何類型的數據,均可以放入數組。將數組清空的一個有效方法,就是將length
屬性設爲0。
數組的slice方法將相似數組的對象,變成真正的數組:Array.prototype.slice.call(arrayLike)。
數組的某個位置是空位,與某個位置是undefined,是不同的。若是是空位,使用數組的forEach方法、for...in結構、以及Object.keys方法進行遍歷,空位都會被跳過。
六、JavaScript引擎將函數名視同變量名,因此採用function命令聲明函數時,整個函數會像變量聲明同樣,被提高到代碼頭部。若是同時採用function
命令和賦值語句聲明同一個函數,最後老是採用賦值語句的定義。
對於var命令來講,局部變量只能在函數內部聲明,在其餘區塊中聲明,一概都是全局變量。
若是函數A
調用函數B
,函數B
不會引用函數A
的內部變量。函數體內部聲明的函數,做用域綁定函數體內部。
函數參數若是是原始類型按值傳遞,若是是複合類型按地址傳遞,若是函數內部修改的,不是參數對象的某個屬性,而是替換掉整個參數,這時不會影響到原始值。
閉包就是函數可以讀取其餘函數內部變量的函數。閉包做用:讀取函數內部變量,讓這些變量始終保存在內存中,封裝對象的私有屬性和私有方法。
七、否運算(~)
八、Number:調用對象自身的valueOf
方法。若是返回原始類型的值,則直接對該值使用Number
函數,再也不進行後續步驟。若是valueOf
方法返回的仍是對象,則改成調用對象自身的toString
方法。若是返回原始類型的值,則對該值使用Number
函數,再也不進行後續步驟。若是toString
方法返回的是對象,就報錯。
String:先調用對象自身的toString
方法。若是返回原始類型的值,則對該值使用String
函數,再也不進行如下步驟。若是toString
方法返回的是對象,再調用valueOf
方法。若是返回原始類型的值,則對該值使用String
函數,再也不進行如下步驟。若是valueOf
方法返回的是對象,就報錯。
Boolean:undefined null -0 0或+0 NaN ''(空字符串)爲false,其他爲true。
九、Error
構造函數,全部拋出的錯誤都是這個構造函數的實例。
原生錯誤類型:SyntaxEror(語法錯誤),ReferenceError(引用一個不存在的變量),RangeError(值超出範圍),TypeError,URIError,EvalError。
若是沒有發生錯誤,則運行finally
代碼塊關閉文件;一旦發生錯誤,則先使用catch
代碼塊處理錯誤,再使用finally
代碼塊關閉文件。
十、避免使用全局變量。若是不得不使用,用大寫字母表示變量名。
全部函數都應該在使用以前定義,函數內部的變量聲明,都應該放在函數的頭部。
建議使用Object.create()
命令,替代new
命令。
不要使用「相等」(==
)運算符,只使用「嚴格相等」(===
)運算符。
建議自增(++
)和自減(--
)運算符儘可能使用+=
和-=
代替。
建議避免使用switch...case
結構,用對象結構代替。
3、標準庫
一、Object.keys
方法只返回可枚舉的屬性,Object.getOwnPropertyNames
方法還返回不可枚舉的屬性名。
var type = function (o){
var s = Object.prototype.toString.call(o);
return s.match(/\[object (.*?)\]/)[1].toLowerCase();
};比typeof更準確。
二、concat
方法返回當前數組的一個淺拷貝。所謂「淺拷貝」,指的是若是數組成員包括複合類型的值(好比對象),則新數組拷貝的是該值的引用。
push
方法還能夠用於向對象添加元素,添加後的對象變成相似數組的對象,即新加入元素的鍵對應數組的索引,而且對象有一個length
屬性。[].push.call(a,1)。
slice
方法的一個重要應用,是將相似數組的對象轉爲真正的數組。Array.prototype.slice.call({...})。
map
方法對數組的全部成員依次調用一個函數,根據函數結果返回一個新數組。map經過call方法還能夠用於字符串。
三、valueOf()返回包裝對象實例對應的原始類型的值。toString()返回實例對應的字符串形式。
原始類型的值,能夠自動看成對象調用,即調用各類對象的方法和參數。這時,JavaScript引擎會自動將原始類型的值轉爲包裝對象,在使用後馬上銷燬。
四、Number:toString(),toFixed()小數位數,toExponential()科學計數法,toPrecision()指定位數的有效數字。
五、String:用slice代替substring。search
方法的用法等同於match
,可是返回值爲匹配的第一個位置。
六、Math.round(-1.5)。返回隨機字符串:
1 function random_str(length) { 2 var a = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; 3 var str = ''; 4 for (var i=0; i < length; ++i) { 5 var rand = Math.floor(Math.random() * a.length); 6 str += a.slice(rand, rand + 1); 7 } 8 return str; 9 }
七、Date:getYear()
:返回距離1900的年數。valueOf
方法返回實例對象距離1970年1月1日00:00:00 UTC對應的毫秒數,該方法等同於getTime
方法。
八、正則:regex.test(string)返回布爾值
。regex.exec(string)返回數組,有lastIndex屬性。string.match(regex)不匹配返回null。search返回第一個知足條件的匹配結果在整個字符串中的位置,不然-1。
九、JSON:JSON.stringify,
JSON.parse
方法用於將JSON字符串轉化成對象。
十、console
十一、屬性描述對象
4、面向對象編程
一、JavaScript的對象體系是基於構造函數(constructor)和原型鏈(prototype)的。使用構造函數(constructor)做爲對象的模板(首字母大寫)。
new
命令的做用,就是執行構造函數,返回一個實例對象。new命令總返回一個對象。
若是構造函數內部有return
語句,並且return
後面跟着一個對象,new
命令會返回return
語句指定的對象;不然,就會無論return
語句,返回this
對象。
二、this
在全局環境使用this
,它指的就是頂層對象window。構造函數中的
this
,指的是實例對象。當A對象的方法被賦予B對象,該方法中的this
就從指向A對象變成了指向B對象。
三、prototype
原型對象的做用,就是定義全部實例對象共享的屬性和方法。
constructor
屬性的做用,是分辨原型對象到底屬於哪一個構造函數。
instanceof
運算符用來比較一個對象是否爲某個構造函數的實例。
Object.getPrototypeOf
方法返回一個對象的原型。
Object.setPrototypeOf
方法能夠爲現有對象設置原型,返回一個新對象。
對象實例的isPrototypeOf
方法,用來判斷一個對象是不是另外一個對象的原型。
四、Object對象與繼承
五、面向對象編程的模式
5、DOM(未看)
一、對於HTML文檔,節點主要有如下六種類型:Document節點、DocumentType節點、Element節點、Attribute節點、Text節點和DocumentFragment節點。
6、瀏覽器環境
一、瀏覽器核心:渲染引擎和JavaScript引擎,
若是腳本之間沒有依賴關係,就使用async
屬性,若是腳本之間有依賴關係,就使用defer
屬性。若是同時使用async
和defer
屬性,後者不起做用,瀏覽器行爲由async
屬性決定。
重流必然致使重繪,重繪不必定須要重流。
根據頁面自己的協議來決定加載協議,這時能夠採用下面的寫法。<script src="//example.js"></script>
二、window.location === document.location。
URL編碼:
encodeURI(),
encodeURIComponent(),
decodeURI(),
decodeURIComponent()。
三、history.back()返回上一頁(從瀏覽器緩存中加載)。
URLSearchParams API用於處理URL之中的查詢字符串,即問號以後的部分。
URLSearchParams
還能夠與URL
接口結合使用。var url = new URL(location);
url.searchParams就是URLSearchParams {}對象。
四、每一個Cookie的大小通常不能超過4KB。
Cookie保存如下幾方面的信息:Cookie的名字,Cookie的值,到期時間,所屬域名(默認是當前域名),生效的路徑(默認是當前網址)。
window.navigator.cookieEnabled
屬性返回一個布爾值,表示瀏覽器是否打開Cookie功能。document.cookie
屬性返回當前網頁的Cookie。
兩個網址只要域名相同和端口相同,就能夠共享Cookie。
五、sessionStorage和localStorage。
JSONP:網頁經過添加一個<script>
元素,向服務器請求JSON數據,這種作法不受同源政策限制;服務器收到請求後,將數據放在一個指定名字的回調函數裏傳回來。
WebSocket是一種通訊協議,使用ws://
(非加密)和wss://
(加密)做爲協議前綴。
六、瀏覽器將CORS請求分紅兩類:簡單請求(simple request)和非簡單請求(not-so-simple request)。
JSONP只支持GET
請求,CORS支持全部類型的HTTP請求。
七、Notification API是瀏覽器的通知接口,用於在用戶的桌面(而不是網頁上)顯示通知信息。
八、Performance API用於精確度量、控制、加強瀏覽器的性能表現。
7、語法專題:
一、JavaScript引擎有多個線程,單個腳本只能在一個線程上運行,其餘線程都是在後臺配合。
爲了利用多核CPU的計算能力,HTML5提出Web Worker標準,容許JavaScript腳本建立多個線程,可是子線程徹底受主線程控制,且不得操做DOM。
所謂Event Loop機制,指的是一種內部循環,用來一輪又一輪地處理消息隊列之中的消息,即執行對應的回調函數。(異步模式)
全部任務分爲同步任務和異步任務。
二、若是被setTimeout
推遲執行的回調函數是某個對象的方法,那麼該方法中的this
關鍵字將指向全局環境。
setIntervel具備累積效應。
三、Promise是JavaScript異步操做解決方案。
四、嚴格模式
以上筆記總結自—— http://javascript.ruanyifeng.com/