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