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