JavaScript標準參考教材(alpha)--筆記

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屬性。若是同時使用asyncdefer屬性,後者不起做用,瀏覽器行爲由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/ 

相關文章
相關標籤/搜索