這是我目前度過最好的js方面的書,小而精,沒有一句廢話全是精華。想要全面理解javascript,這本書必讀。 javascript
P6 避免使用 /* */註釋 建議使用// java
P17 對象字面量是一種方便指定新對象的表示方法。屬性名能夠是標識符或者字符串。這些名字被當作字面量名而不是變量名來對待,因此對象的屬性名在編譯時才能知道。屬性的值就是表達式。 正則表達式
P20
簡單類型: 數字,字符串,布爾值,null值和undefined值
對象類型:數組,函數,正則表達式,對象。
對象是可變的鍵控集合,對象是屬性的容器,每一個屬性都擁有名字和值。
屬性的名字能夠是包括空字符串在內的任意字符串,屬性值能夠是除undefined值以外的任何值。 shell
P21 || 運算符能夠用來填充默認值
var a=objecta.somenotexist || "unknowa"; 編程
P22 對象經過引用來傳遞
var a=b=c={}; a,b,c都引用同一個空對象 數組
每一個對象都鏈接到一個原型對象,而且它能夠從中繼承屬性。
全部經過對象字面量建立的對象都鏈接到Object.prototype這個javascript中標準的對象。
當你建立一個新對象時,你能夠選擇某個對象做爲它的原型。 閉包
咱們這裏給Object增長一個beget方法,這個方法建立一個使用原對象做爲其原型的新對象。 app
if(typeof Object.beget!='function'){ Object.beget=function(o){ var F=function(){}; F.prototype=o; return new F(); }; }
當咱們對某個對象作出改變時,不會觸及該對象的原型。相反咱們添加一個新的屬性到原型中,該屬性會當即對全部基於該原型建立的對象可見。 編程語言
P23 委託
若是咱們嘗試去獲取對象的某個屬性,且該對象沒有此屬性名,那麼javascript會嘗試着從原型對象中獲取屬性值,若是那個原型對象也沒有改屬性,那麼再從它的原型中尋找,依次類推,直到過程最後到達終點Object.prototype. 若是想要的屬性徹底不存在於原型鏈中,那麼結果就是undefined值。這個過程稱爲委託。 函數
P24
for in語句能夠用來遍歷一個對象中的全部屬性名,屬性名出線的順序是不肯定的。若是須要按照必定的順序顯示屬性能夠用for 數組遍歷。
delete 運算符能夠刪除對象屬性。可是不會觸及原型鏈中的任何對象。刪除對象屬性可能讓來自原型鏈中的屬性浮現出來。
方法2 閉包
P26
所謂編程就是將一組需求分解成一組函數與數組結構的技能。
對象字面量產生的對象鏈接到Object.prototype.函數對象鏈接到Function.prototype(該原型對象自己鏈接到Object.prototype).每一個函數在建立時附有兩個附加隱藏屬性:函數的上下文和實現函數行爲的代碼。
每一個函數對象在建立時也隨帶有一個prototype屬性。它的值是一個擁有constructor屬性且值爲該函數的對象。
var functiona=function(){var b;}; var a=functiona.prototype; alert( a.constructor);
P27
函數能夠用它的名字來遞歸地調用本身。
經過函數的字面量建立的函數對象包含一個鏈接到外部上下文的鏈接。這被稱爲閉包。
調用函數時,每一個函數接收到兩個附加的參數:this和arguments.this的值取決於調用模式。
在JavaScript中一共有四中調用模式:方法調用模式,函數調用模式,構造器調用模式和apply調用模式。
P28
實際參數arguments 形式參數parameters
當一個函數被保存爲對象的一個屬性時,咱們稱它爲一個方法。
當一個方法被調用時,this被綁定到該對象。
超級遲綁定 very late binding
方法調用模式: 經過this可取得它們所屬對象上下文的方法稱爲公共方法。
P29
JavaScript是一門基於原型繼承的語言。
構造器調用模式: 若是在一個函數前面帶上new來調用,那麼將建立一個隱藏鏈接到該函數的prototype成員的新對象,同時this將會被綁定到哪一個新對象上。
結合new前綴調用的函數被稱爲構造函數。
P30
JavaScript是一門函數式的面向對象編程語言,因此函數能夠擁有方法。
apply方法接受兩個參數。第一個是將被綁定給this的值,第二個就是一個參數數組。
apply方法的調用形式能夠調用函數也能夠調用公共方法。
P31
當函數被調用時,會獲得一個免費奉送的參數,arguments數組。
arguments並非一個真正的數組。它只是一個相似數組(array-like)的對象。
若是函數以在前面加上new前綴的方式來調用,且返回值不是一個對象,則返回this(該新對象)。
P32
經過給Object.prototype添加方法或者屬性使得該方法或者屬性對全部對象可用。
Function.prototype.method1=function(name,func){ this.prototype[name]=func; return this; }; Number.method1('interger1',function(){ return Math[this < 0 ? 'ceil':'floor'](this); }); document.writeln((-10/3).interger1()); document.writeln((10/3).interger1());
P33
基本類型的原型是公共的結構
P36 做用域
做用域控制着變量與參數的可見性及生命週期,並提供了自動內存管理。
P38 閉包
函數能夠訪問它被建立時所處的上下文環境,這被稱爲閉包。
var quo=function(status){ return { get_status:function(){ return status; } }; }; var myQuo=quo("amazed"); document.writeln(myQuo.get_status());
//myQuo的函數get_status()被建立後還能夠訪問參數status ,就稱爲閉包。
P40 模塊
咱們可使用函數和閉包來構造模塊。模塊是一個提供接口卻隱藏狀態與實現的函數或對象。
P41
模塊模式的通常形式是:一個定義了私有變量和函數的函數;利用閉包建立能夠訪問私有變量和函數的特權函數;最後返回這個特權函數,或者把他們保存到一個能夠訪問的地方。Function.prototype.method1=function(name,func){ if(!this.prototype[name]) { this.prototype[name]=func; return this; } }; String.method1('deentityify',function(){ var entity={ quot:'"', lt:'<', gt:'>' }; return function(){ return this.replace(/&([^&;]+);/g,function(a,b){ var r=entity[b]; return typeof r==='string'?r:a; }); }; }()); document.writeln('<">'.deentityify());
模塊模式一般結合單例模式(Singleton Pattern)使用。JavaScript的單例就是用對象字面量表示法建立的對象,對象的屬性值能夠是數值或函數,而且屬性值在該對象的生命週期中不會發生變化。
P43 級聯
沒有返回值的方法會返回undefined, 若是咱們讓方法返回this而不是undefined,就能夠啓用級聯。
在一個級聯中,咱們能夠在單獨一條的語句中依次調用同一個對象的不少方法。
套用
套用容許咱們將函數與傳遞給它的參數相結合去產生出一個新的函數。
P44 記憶
函數能夠用對象記住先前操做的結果,從而能避免無謂的運算。這種優化被稱爲記憶(memoization).
var memoizer=function(memo,fundamental){ var shell=function(n){ var result=memo[n]; if(typeof result !=='number'){ result=fundamental(shell,n); memo[n]=result; } return result; }; return shell; }; var fibonacci=memoizer([0,1],function(shell,n){ return shell(n-1)+shell(n-2); }); for(var i=0;i<=10;i+=1){ document.writeln("//"+i+":"+fibonacci(i)); } //以上代碼我尚未理解清楚,須要往後再琢磨
第五章 繼承
繼承這章挺難理解的,還須要仔細再琢磨琢磨
P46 在基於類的語言中,對象是類的實例,而且類能夠從另外一個類繼承。JavasCript是一門基於原型的語言,這意味着對象直接從其餘對象繼承。
P50
第六章 數組
P59 JavaScript容許數組包含任意混合類型的值。 length屬性的值是這個數組的最大整數屬性名加上1。它不等於數組裏的屬性的個數。 第七章 正則表達式 P65 正則表達式是一門簡單語言的語法規範。可處理正則表達式的方式有regexp.exec,regexp.test,string.match,string.replace,string.search,string.split