摘要:最近在讀語言精粹這本書,作者是是一名來自的資深架構師,以創建和維護格式而為大家所熟知。三元運算符有三個運算數。嘗試從的成員屬性中取值將會導致異常。這個過程稱為委托。通過可取得它們所屬對象的上下文的方法稱為公共方法。
最近在讀《JavaScript語言精粹》這本書,作者是 Douglas Crockford;Douglas Crockford是一名來自 Yahoo!的資深JavaScript架構師,以創建和維護JSON(JavaScript object notation)格式而為大家所熟知。他會定期在各類會議上發表有關高級JavaScript的主題演講。他也是ESMAscript委員會的成員之一。
本來想寫一篇讀后感的,但是想想,《JavaScript語言精粹》是我在JavaScript方面閱讀的第一本書,算是開拓視野,所以心中只有對這本書的總結,談不上有感。而且我的目的就是為了節省閱讀這本書的時間,幫助大家了解大概的內容,我會盡量把自己覺得其中的精髓傳達給想讀這本書的朋友。
注意:這本書不是給初學者的,也不是一本傻瓜式的教程。
JavaScript的兩種注釋形式:/**/(塊注釋)和 //(行注釋)
塊注釋的字符對可能出現在現在正則表達式的字面量里,所以塊注釋相對來說不安全
例如:
/* var rm_a = /a*/.match(s); */
作者建議盡量避免使用 /**/注釋,用 //來代替它。
標識符標識符有一個字母開頭,其后可以選擇性的加上一個或多個字母、數字或下劃線。
標識符不能使用下面這些保留字:
abstract boolean break byte case catch char class const continue debugger default delete do double else enum export extends false final finally float for function goto if implements import in instanceof int interface long native new null package private protected public return short static super switch synchronized this throw throws transient true try typeof var volatile void while with數字
JavaScript只有一個數字類型。它在內部被表示與64位的浮點數,和Java的double數字類型一樣。
如果一個數字字面量有指數部分,那么這個字面量的值等于e之前的數字與10的e之后的數字的次方相乘。所以 100和 1e2是相同的數字。
數字擁有方法,JavaScript有一個對象Math,它包含一套用于數字的方法。
例如,可以用Math.floor(number)方法把一個數字轉換為一個整數。
JavaScript沒有字符類型。要表示一個字符,只需創建僅包含一個字符的字符串即可。
字符串有一個 length屬性。例如,"seven".length是5。
字符串也有一些方法。例如,"cat".toUpperCase( ) === "CAT"
語句當 var語句被用于函數內部時,它定義的是這個函數的私有變量。
語句通常是按照從上到下的順序被執行。JavaScript可以通過條件語句(if和switch)、循環語句(while、for和do)、強制跳轉語句(break、return和throw)和函數調用來改變執行的序列
表達式1. . [] () ----------提取屬性與調用函數 2. * / % ----------乘法、除法、求余 3. && ----------邏輯 與 4.|| ----------邏輯 或 5.?: ----------三元
三元運算符?后面跟著另一個表達式,然后接一個:,其后面接第三個表達式。
三元運算符?有三個運算數。如果第1個運算數的值為真,產生第2個運算數的值;如果為假,則產生第3個是運算數的值。
JavaScript里的對象是無類型的(class-free),對象可以包含其他對象。
JavaScript包含一種原型鏈的特征,允許對象繼承另一個對象的屬性。正確的使用它能減少對象初始化時消耗的時間和內存。
1、對象字面量 Object Literals
JavaScript的標識符中包含連接符“-”是不合法的,但是允許包含下劃線“_”,
所以用引號括住“first-name”是必需的。
2、檢索 Retrieval
要檢索對象里包含的值,可以采用[]后綴中括住一個字符串表達式的方式。
如果字符串表達式是一個字符串字面量,那么也可以用 . 表示法代替。
考慮優先使用 . 表示法,因為它更緊湊且可讀性更好。
如果你嘗試檢索一個并不存在的成員屬性的值,將返回undefined。
嘗試從undefined的成員屬性中取值將會導致TypeError異常。這時可以通過 && 運算符來避免錯誤。
3、原型 Prototype
每個對象都連接到一個原型對象,并且它可以從中繼承屬性。所有通過對象字面量創建的對象都連接的Object.prototype,它是JavaScript中標配對象。
當你創建一個新對象時,你可以選擇某個對象作為它的原型。JavaScript提供的實現機制雜亂而復雜,但其實可以被明顯地簡化。我們將給Object增加一個create方法。這個方法創建一個使用原對象作為其原型的新對象。
if(typeof Object.beget !== "function") { Object.create = function(o) { var F = function() {}; F.prototype = o; return new F(); }; } var another_stooge = Object.create(stooge);
原型連接在更新時是不起作用的。當我們對某個對象做出的改變時,不會影響該對象的原型。
如果我們嘗試去獲取對象的某個屬性值,但該對象沒有此屬性名,那么JavaScript會試著從原型對象中去獲取屬性值。如果那個原型對象也沒有改屬性,那么再從它的原型中尋找,依此類推,直到最后到達終點Object.prototype。
如果想要的屬性完全不存在原型鏈中,那么結果就是undefined值。這個過程稱為委托。
原型關系是一種動態關系。如果我們添加一個新的屬性到原型中,該屬性會立即對所有基于該原型創建的對象可見。
4、反射 Reflection
檢查對象并確定對象有什么屬性是很容易的事情,只要試著去檢索該屬性并驗證取得的值。Typeof 操作符對確定屬性的類型有很大的幫助:
typeof flight.number //"number" typeof flight.status //"string" typeof flight.arrival //"object" typeof flight.manifest //"undefined"
注意任何原型鏈中的任何屬性都會產生值:
typeof flight.toString //"function" typeof flight.constructor //"function"
有兩種方法處理掉這些不需要的屬性。第一個是讓你的程序做檢查并丟棄值為函數的屬性。另一個就是使用 hasOwnProperty 方法,如果對象有獨有的屬性,它將返回 true。
hasOwnProperty方法不會檢查原型鏈。
fligth.hasOwnProperty("number") //true flight.hasOwnProperty("constructor") //false
5、枚舉 Enumeration
for in 語句可用來遍歷一個對象中所有屬性名。改枚舉過程將會列出所以的屬性——包括函數和你可能不關心的原型中的屬性——所以沒必要過濾掉那些你不想要的值。最為常用的過濾器是 hasOwnProperty 方法,以及使用 typeof 來排除函數:
var name; for(name in another_stooge) { if(typeof another_stooge[name] !== "function") { document.writeln(name + ":" + another_stooge[name]); } }
屬性名出現的順序是不確定的,因此要對任何可能出現的順序有所準備。如果你想要確保屬性以特定的順序出現,最后的辦法是完全避免使用 for in 語句,而是創建一個數組,在其中以正確的順序包含屬性名:
var i; var propertier = { "fiirst-name", "middle-name", "last-name", "profession" }; for(i = 0; i< properties.length; i += 1) { document.writeln(properties[i] + ":" + another_stooge[properties[i]]); }
通過 for 而不是 for in,可以得到我們想要的屬性,而不用擔心可能發掘出原型鏈中的屬性,并且我們按正確的順序取得了它們的值。
6、刪除 Delete
delete運算符可以用來刪除對象的屬性。如果對象包含該屬性,那么該屬性就會被移除。它不會觸及原型鏈中的任何對象。
刪除對象的屬性可能會讓來自原型鏈中的屬性透現出來:
another_stooge.nickname //"Moe" delete another_stooge.nickname; another_stooge.nickname //"Curly"
7、減少全局變量污染 Global Abatement
全局變量削弱了程序的靈活性,應該避免使用。
最小化使用全局變量的方法之一是為你的應用值創建一個唯一的全局變量:
var MYAPP = {};
該變量此時變成了你的應用的容器:
MYAPP.stooge = { "first-name": "joe", "last-name": "Howard" }; MYAPP.flight = { airline: "Oceanic", departure: { IATA: "SYD", city: "Sydney" } };
只要把全局性的資源都納入一個名稱空間下,你的這個程序與其他應用程序、組件或類庫之間發生沖突的可能性就會顯著降低。這個程序也會變得更容易閱讀,因為很明顯,MYAPP.stooge 指向的是頂層結構。還有一種有效減少全局污染的方法,隱藏信息的方法,就是 閉包!
函數 Functions1、函數字面量 Function Literal
函數對象通過函數字面量來創建:
//創建一個名為 add 的變量,并用來把兩個數字相加的函數賦值給它 var add = function(a,b) { return a + b; };
函數字面量包括4個部分。
第1個部分是保留字 function。
第2個部分是函數名,它可以被省略。函數可以用它的名字遞歸地調用自己。此名字也可能被調試器和開發工具用來識別函數。如果沒有給函數命名,則它被成為匿名函數(anonymous)。
第3個部分是包圍在圓括號中的一組參數。多個參數用逗號隔開。這些參數的名稱被定義為函數中的變量。它們不像普通的變量那樣被初始化為 undefined,而是在該函數被調用時初始化為實際提供的參數的值。
第4個部分是包圍在花括號中的一組語句。這些語句是函數的主體,它們在函數被調用是執行。
函數字面量可以出現在任何允許表達式出現的地方。一個內部函數除了可以訪問自己的參數和變量,同時它也能自由訪問把它嵌套在其中的父函數的參數和變量。通過函數字面量創建的函數對象包含一個連到外部上下文的連接。這被稱為 閉包(closure)。它是JavaScript強大表現力的來源!
2、調用 Invocation
調用一個函數會暫停當前函數的執行,傳遞控制權和參數給新函數。除了聲明時定義的形式參數,每個參數還接手兩個附加的參數:this 和 arguments。參數 this 在面向對象編程中非常重要,它的值取決于調用的模式。在JavaScript中一共有4種調用模式:方法調用模式、函數調用模式、構造器調用模式和 apply 調用模式。這些模式在如果初始化關鍵參數 this 上存在差異。
調用運算符是跟任何產生一個函數值的表達式后的一對圓括號。圓括號中內可包含0個或多個用逗號隔開的表達式。每個表達式產生一個參數值。每個參數值被賦予函數聲明時定義的形式參數名。當實際參數(arguments)和形式參數(parameters)的個數不匹配時,不會導致運行時的錯誤。如果實際參數值過多了,超出的參數值會被忽略。如果實際參數值過少,缺失的值被替換為 undefined 。對參數值不會進行類型檢查:任何類型的值都可以被傳遞給任何參數。
方法調用模式 The Method Invocation Pattern
當一個函數被保存為對象的一個屬性是,我們稱它為一個方法。當一個方法被調用時, this 被綁定到該對象。如果調用表達式包含一個提取屬性的動作(即包含一個 . 點符號的表達式或[subscript]下標表達式),那么它就是被當做一個方法來調用。
var myObject = { value :0; increment:function(inc){ this.value += typeof inc ==="number"?inc:1; } / /increment方法接受一個可選的參數,如果參數不是數字,默認使用數字1. }; myObject.increment(); document.writeln(myObject.value); // 1 myObject.increment(2); document.writeln(myObject.value); // 3
方法可以使用 this 去訪問對象,能從對象中修改該對象。this 到對象的每綁定發生在調用的時候,這個超級遲綁定使用函數可以對 this 高度復用。通過 this 可取得它們所屬對象的上下文的方法稱為公共方法。
函數調用模式 The Function Invocation Pattern
當函數并非對象的屬性時,它被當作一個函數來調用:
var sum = add(3, 4); //sum的值為7
當函數以此模式調用時,this 被綁定到全局對象,這是語言設計上的一個錯誤。當內部函數被調用時,this 應該綁定到外部函數的 this 變量。解決方案是:如果該方法定義一個變量并給它賦值為 this ,那么內部函數就可以通過那個變量訪問到 this,按照約定,命名為 that:
myObject.double = function () { // 給myObject增加一個double方法 var that = this; // 解決方法 var helper = function() { that.value = add(that.value, that.value); }; helper(); // 以函數的形式調用helper }; myObject.double(); // 以方法的形式調用double document.writeln(myObject.Value()); //6
構造器調用模式 The Constructor Invocation Pattern
JavaScript是基于原型繼承的語言,意味著對象可以直接從其它對象繼承屬性,該語言是無類別的。
如果在一個函數前面帶上new來調用,將創建一個隱藏連接到該函數的prototype成員的新對象,同時this將會被綁定到那個新對象上。new前綴也會改變return語句的行為。
var Quo = function (string){ //創建構造器函數Quo,有status屬性的對象 this.status = string; }; Quo.prototype.get_status = function() { //提供一個名為get_status的公共方法 return this.status; }; var myQuo = new Quo("confused"); //構造一個Quo實例 document.wirteln(myQuo.get_status()); //打印顯示“confused”
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/87914.html
摘要:前言今天和大家一起聊聊的推薦書籍,每一本都是精選,做前端開發的朋友們如果沒讀過,可以嘗試一下。如果怕麻煩,也可以關注曉舟報告,發送獲取書籍,四個字,就可以得到電子書的提取碼。 前言 今天和大家一起聊聊JavaScript的推薦書籍,每一本都是精選,做前端開發的朋友們如果沒讀過,可以嘗試一下。下面給大家簡單介紹了書的內容,還有讀書的方法,希望可以幫大家提升讀書效率。 一、《JavaScr...
摘要:開發者論壇每周選取精華內容總結,精選論壇優質貼,每周更新一期,方便大家閱讀不同賬號,同一,同一地域,多臺臺如何達到內網互通摘要急急急,求問不同阿里云賬號,同一,同一地域,多臺臺如何達到內網互通。開發者論壇每周選取精華內容總結,精選論壇優質貼,每周更新一期,方便大家閱讀! 不同賬號,同一VPC,同一地域,多臺ECS(20臺)如何達到內網互通 claire840730摘要:急急急,求問不...
摘要:的內置函數整理了一些語言精粹的方法一章的整理出的的內置方法之后還會整理標準入門的新添加的方法整理這些作用一方面是更好的理解記憶另一方面是對于類數組可以使用原型鏈的調用即可中的一些函數輸出的為的結果因此的作用是連接數組當然可以是數字也會加入到 Javascript的內置函數(ES5) 整理了一些Javascript語言精粹的方法一章的整理出的ES5的內置方法; 之后還會整理ES6標準入門...
摘要:最近在讀這本評價頗高的語言精粹,其作者是的創造者,在業界頗有名氣。 最近在讀這本評價頗高的《JavaScript語言精粹》,其作者Douglas Crockford 是JSON的創造者,在業界頗有名氣。以下是閱讀過程中認為比較有用的摘錄的代碼,希望能對各位有所啟發 自定義的method方法 Function.prototype.method = function(name,func...
閱讀 3212·2023-04-25 18:43
閱讀 891·2021-11-24 09:39
閱讀 1361·2021-10-14 09:43
閱讀 3890·2021-09-22 15:58
閱讀 1899·2019-08-29 17:18
閱讀 409·2019-08-29 14:14
閱讀 3077·2019-08-29 13:01
閱讀 1614·2019-08-29 12:33