JavaScript語言精粹(讀書筆記)


第一章 精華

1,JavaScript的函數(主要)基於詞法作用域(lexical scoping)的頂級對象。強類型語言允許編譯器在編譯時檢測錯誤,但弱類型很自由,無需建立復雜的類層次,不用做強制造型。JavaScript擁有強大的對象字面量表示法,這種表示法是JSON的靈感來源。

2,JavaScript有一個無類型的(class-free)對象系統,在這個系統中,對象可以直接從其他對象繼承屬性。

3,JavaScript依賴於全局變量來進行連接,所有編譯單元的所有頂級變量被撮合到一個全局對象(the global object)的公共命名空間中【糟糕】。

第二章 語法

1,兩種注釋形式:/* */塊注釋(來自於一種PL/I的語言)有些字符也可能出現在正則里,//行注釋(推薦使用)。

2,標識符由字母下划線或$開頭,不能使用保留字作為對象的屬性名。

3,JavaScript只有一種數字類型,它在內部被表示為64位的浮點數,沒分離出整數類型,所以避免了短整形的溢出問題,你只需要它是一種數字。

4,JavaScript在創建時,Unicode是一個16位的字符集,所以所有字符都是16位的,它沒有字符類型,用字符串表示字符。'F'+'u'+'n'==='Fun','Fun'.toUpperCase()==='FUN'。

5,下列值都為假:false null undefined '' 0 NaN;其余為真(包括true,'false')。for in語句會枚舉一個對象的所有屬性名(或鍵名),該枚舉過程會列出所有的屬性,屬性名出現的順序是不確定的,通常用Object.hasOwnProperty(variable)確定這個屬性名是該對象的成員還是來自原型鏈。try{執行一個代碼塊並捕獲代碼塊拋出的任何異常(throw通常在這里)}catch{接收異常error.message}。

6,運算符. [] ()優先級最高,typeof運算符產生的值有number string boolean undefined function object,但是typeof(數組或null)都是object。

第三章 對象

1,JavaScript中的對象是可變的鍵控集合(keyed collections),是無類型的,對象是屬性的容器。正確使用原型鏈能減少對象初始化時消耗的時間和內存。

2,檢索對象里的值,可以用[]或. ,若果不存在返回undefined,||可用來填充默認值,嘗試從undefined的成員屬性中取值會導致TypeError異常,可以用&&避免錯誤如下:

   x.a               //undefined
   x.a.b            //TypeError
   x.a && x.a.b //undefined

3,對象里的值可通過賦值語句來更新,如果屬性名已存在,則屬性值被替換;如果之前沒有,則擴充到對象中。

4,對象通過引用來傳遞,它們永遠不會被復制。

5,所有通過對象字面量創建的對象都連接到Object.prototype,create方法創建一個使用原對象作為作為其原型的新對象。原型連接在更新時是不起作用的。原型連接只有在檢索值時才被用到,順着原型鏈忘上找稱為委托。

6,有兩種方法處理掉不需要的屬性,第一個然你的程序做檢查並丟棄typeof值為函數的屬性,另一個是hasOwnProperty(不會檢查原型鏈)如x.hasOwnProperty('constroctor') //false。

7,delete用來刪除對象的屬性,不會觸及原型鏈,刪除對象的屬性可能會讓原型鏈中的屬性透現出來。

8,最小化使用全局變量的方法之一是為你的應用只創建一個唯一的全局變量:var x={};x.a={...};x.b={...} 。

第四章 函數 *

1,對象字面量產生的對象連接到Object.prototype,函數對象連接到Function.prototype,prototype的值是一個擁有constructor屬性且值為該函數的對象。每個函數創建時會附加兩個隱藏屬性:函數的上下文和實現函數行為的代碼。

2,函數字面量var add=function(a,b){},參數不會初始化為undefined而是在函數被調用時初始化為實際提供的參數的值。

3,調用函數會接受附加的參數:this和arguments,this的值取決於調用的模式,四種調用模式:方法調用 函數調用 構造器調用 apply調用。

4,內部函數能訪問外部函數的實際變量而無需復制。

第五章 繼承 *

1,繼承模式的一個弱點是沒法保護隱私,可以用模塊模式。

第六章 數組

1,數組是一段線性分配的內存,它通過整數計算偏移並訪問其中的元素,不過JavaScript並無類似的數據結構,但擁有一些類數組(array-like)特性的對象,他把數組下標變成字符串,用其作為屬性。

2,設置更大的length值不會給數組分配更多的空間,而把length設小導致下標大於等於length的刪除;附加新元素到尾部:arr[arr.length],也可以用push。

3,delete數組的元素會留下空洞,因為排在后面的元素保留着它們最初的屬性;可以用splice(數組中的一個序號,要刪除的元素個數),因為被刪除屬性后的每個屬性必須被移除,並且以一個新的鍵值重新插入,這樣對於大型數組效率不高。

4,當屬姓名是小而連續的整數時,應使用數組,否則,使用對象。判斷一個對象否為數組:

   var is_array=function(value){
     return Object.prototype.toString.apply(value)==='[object Array]'
   }

第七章 正則表達式

1,兩種方法創建一個RegExp對象,優先考慮正則表達式字面量(包圍在一對斜杠里), 另一個是使用RegExp構造器,這個構造器接收一個字符串並編譯成一個RegExp對象。

2,一個正則表達式分支包含一個或多個正則表達式序列,這些序列用|分開,一個正則表達式序列包含一個或多個正則表達式因子。

第八章 方法

1,array.concat(item...) 產生一個新數組,它包含一份array的淺復制(shallow copy)並把item附在其后,array不變;

   array.join(separator) 構造成一個字符串,分隔符默認為, ;

   array.pop() 移除最后一個並返回該元素,array.push(item...)會修改array尾部,且如果item有數組,會作為一項加入;

   array.reverse() 反轉元素且改變array;

   array.shift() 移除第一個元素並返回該元素,比pop慢;

   array.slice(start,end) 淺復制從start到end,end可選,若參數有負數和array.length相加;

   array.sort(comparefn) 按大小排如:n.sort(function(a,b){
                                                        return a-b
                                                    } )

  array.splice(start,deleteCount,item...) 用item替換刪除的元素;

  array.unshift(item...) 把item插入到array的開始部分,array變。

2,function.apply(thisArg,argArray)。

3,number.toExponential(fractionDigits) 轉換成一個指數形式的字符串,fractionDigits控制小數點后的數字位數(0-20);

   number.toFixed(fractionDigits) 轉換成一個十進制的字符串;

   number.toPricision(pricision) 轉換成一個十進制數形式的字符串 ,precision控制數字的精度(0-21);

   number.toString(radix)轉換成字符串,radix控制基數(2-36)。

4,object.hasOwnProperty(name) ,原型鏈中的同名屬性是不會被檢查的;

   如:var a={name:'aaa'};
         var b=Object.create(a);
         a.hasOwnProperty('name');  //true
         b.hasOwnProperty('name');  //false
         b.name;  //'aaa'

5,regexp.exep(string) 正則表達式最強大(和最慢)的方法,它會返回一個數組;

   regexp.test(string) 正則表達式最簡單(和最快)的方法。

6,string.charAt(pos) 返回string中pos位置處的字符,不存在返回空;

   string.charCodeAt(pos) 以整數形式返回字符編碼,不存在返回NaN;

   string.concat(string...) 連接字符串,也可以用+ ;

   string.indexOf(searchString,position) stirng是從某個位置開始查,不存在返回-1;

   string.lastIndexOf(searchString,position) 從末尾查找;

   string.localeCompare(that) 若string比that小,結果為負數,若相等為0;

   string.match(regexp) 如果沒有g標識,則與調用regexp.exec(string)的結果相同;

   stirng.replace(searchValue,replaceValue) searchValue可以是字符串或正則,若是字符串只會改第一處;

   string.search(regexp) 返回第一個匹配的首字符位置,不存在返回-1;

   string.slice(start,end);

   string.split(separator,limit) 把string分割成片段來創建一個字符串數組,limit限制被分割的片段數量(可選);

   string.substring(start,end) 和slice一樣,但不能處理負數,用slice;

   string.toLocaleLowerCase() 本地化規則轉小寫;

   string.toLocaleUpperCase() 本地化規則轉大寫;

   string.toLowerCase() 轉小寫;

   string.toUpperCase() 轉大寫;

   string.fromCharCode(char...) 根據一串數字編碼返回一個字符串。

第九章 代碼風格

1,JavaScript的弱類型和過度的容錯性導致程序質量無法在編譯時獲得保障。

2,把 { 放在一行的結尾而不是下一行的開頭,因為它會避免JavaScript的return語句中的一個設計錯誤。JavaScript有函數作用域沒有塊級作用域。K&R代碼風格是最普遍的C語言代碼風格

3,對一個腳本應用或工具庫,只用一個全局變量。每個對象都有它自己的命名空間,多以很容易用對象去管理代碼。使用閉包能提供近一步的信息隱藏,增強模塊的健壯性。

第十章 優美的特性

。。。

附錄A 毒瘤 

1,全局變量  2,作用域  3,自動插入分號  

4,保留字:當保留字被用作對象字面量的鍵值時,他們必須被用括號括起來,且不能用點表示法,用括號表示法。

5,Unicode  6,typeof null==='object'  7,parseInt  8,+  9,浮點數  10,0.1+0.2!=0.3  11,NaN !== NaN

12,偽數組  13,假值:0 NaN '' false null undefined  14,hasOwnProperty  15,對象

附錄B 糟粕

1,==  2,with語句  3,eval  4,continue語句  5,switch穿越

6,缺少塊的語句  7,++ --  8,位運算符  9,function語句與表達式

10,類型的包裝對象  11,new  12,void

附錄C JSLint

附錄D JSON語法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM