【读书笔记】《Javascript语言精粹》
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
第二章 語(yǔ)法
通過(guò)檢測(cè) object.hasOwnProperty(variable)來(lái)確定屬性名就是改對(duì)象的成員,還是從其原型鏈里找到的。
for?(myvar?in?obj){if?(obj.hasOwnProperty(myvar)){...} }第三章 對(duì)象
對(duì)象屬性值初始化和檢索
檢索一個(gè)并不存在的成員元素的值,將返回一個(gè)undefined
可以使用 || 運(yùn)算符填充默認(rèn)值,如 var middle = stooge[“middle-name”] || “(none)”;
可以用 && 運(yùn)算符來(lái)避免檢索一個(gè)undefined值導(dǎo)致的TypeError異常,如 flight.equipment && flight.equipment.model
對(duì)象通過(guò)引用來(lái)傳遞,永遠(yuǎn)不會(huì)被拷貝:
使用原對(duì)象作為其原型的新對(duì)象
原型連接在更新時(shí)是不起作用的。當(dāng)我們對(duì)某個(gè)對(duì)象作出改變時(shí),不會(huì)觸及到該對(duì)象的原型。
委托
原型連接只有在檢索值的時(shí)候才被用到。如果我們嘗試去獲取對(duì)象的某個(gè)屬性值,且該對(duì)象沒有次屬性命,那么Javascript會(huì)試著從原型對(duì)象中獲取屬性值。如果那個(gè)原型對(duì)象也沒有該屬性,那么再?gòu)乃脑椭袑ふ?#xff0c;一次類推,直到該多承最后到達(dá)終點(diǎn)Object.prototype。如果想要的屬性完全不存在于原型鏈中,那么結(jié)果就是undefined值。
枚舉?
for?(name?in?another_stooge){...... }刪除對(duì)象的屬性?
another_stooge.nickname;??????????//"moe" delete?another_stooge.nickname; //刪除another_stooge的nickname屬性,從而暴露出原型的nickname屬性 another_stooge.nickname;??????????//"curly"?(原型的該屬性值)減少全局變量污染:可以創(chuàng)建唯一一個(gè)全局變量,var MYAPP = {};將該變量作為容器,往其中添加屬性值。
第四章 函數(shù)
調(diào)用
在Javascript 中一共有四種調(diào)用模式:方法調(diào)用模式、函數(shù)調(diào)用模式、構(gòu)造器調(diào)用模式、apply調(diào)用模式。
每個(gè)函數(shù)在接收參數(shù)時(shí),會(huì)接受兩個(gè)附加的參數(shù):this 和 arguments 。this 取決于上述不同的調(diào)用模式。
方法調(diào)用模式
當(dāng)一個(gè)函數(shù)被保存為對(duì)象的一個(gè)屬性時(shí),成為方法。當(dāng)一個(gè)方法被調(diào)用時(shí),this被綁定倒該對(duì)象。如果一個(gè)調(diào)用表達(dá)式包含一個(gè)屬性存取表達(dá)式,那么它被當(dāng)作一個(gè)方法來(lái)調(diào)用。
方法可以使用this去訪問對(duì)象,所以它能從對(duì)象中取值或修改該對(duì)象。this 倒對(duì)象的綁定發(fā)生在調(diào)用的時(shí)候。這個(gè) 超級(jí) 遲綁定(very late binding)使得函數(shù)可以對(duì)this 高度復(fù)用。通過(guò)this可取得它們所屬對(duì)象的上下文的方法成為 [公共方法]。
函數(shù)調(diào)用模式
當(dāng)一個(gè)函數(shù)并非一個(gè)對(duì)象的屬性時(shí),那么它被當(dāng)作一個(gè)函數(shù)來(lái)調(diào)用:var sum = add(3,4); //sum 值為7
當(dāng)函數(shù)以此模式調(diào)用時(shí),this被綁定到全局對(duì)象。因此,內(nèi)部函數(shù)的this時(shí)無(wú)法共享該方法對(duì)對(duì)象的訪問權(quán)。解決方案:如果該方法定義一個(gè)變量并給它賦值為this,那么內(nèi)部函數(shù)就可也i通過(guò)那個(gè)變量訪問到this。如下所示:
構(gòu)造器調(diào)用模式
Javascript是基于原型繼承的語(yǔ)言。對(duì)象可以直接從其他對(duì)象繼承屬性。
如果在一個(gè)函數(shù)前面帶上new 來(lái)調(diào)用,那么將創(chuàng)建一個(gè)隱藏連接到該函數(shù)的 prototype 成員的新對(duì)象,同時(shí)this 將會(huì)被綁定到那個(gè)新對(duì)象上。new 前綴也會(huì)改變r(jià)eturn 語(yǔ)句的行為。
//創(chuàng)建一個(gè)名為Quo?的構(gòu)造器函數(shù)。它構(gòu)造一個(gè)帶有?status?屬性的對(duì)象。 var?Quo?=?function?(string)?{this.status?=?string; }; //給Quo?的所有實(shí)例提供一個(gè)名為get_status?的公共方法。 Quo.prototype.get_status?=?function?()?{return?this.status; } //構(gòu)造一個(gè)?Quo?實(shí)例 var?myQuo?=?new?Quo("confused"); document.writeIn(myQuo.get_status());其目的就是結(jié)合new前綴調(diào)用的函數(shù),被成為構(gòu)造器函數(shù)。必須以首字母大寫格式來(lái)命名構(gòu)造器函數(shù),調(diào)用構(gòu)造器函數(shù)時(shí)必須在前面加上new 。
Apply調(diào)用模式?
apply 方法讓我們構(gòu)建一個(gè)參數(shù)數(shù)組并用其去調(diào)用函數(shù)。它允許我們選擇this 的值。apply 方法接收兩個(gè)參數(shù)。第一個(gè)是將被綁定給this 的值。第二個(gè)就是一個(gè)參數(shù)數(shù)組。
參數(shù)
當(dāng)函數(shù)被調(diào)用時(shí),會(huì)得到一個(gè)參數(shù)數(shù)組 arguments。通過(guò)它,函數(shù)可以訪問所有它被調(diào)用時(shí)傳遞給它的參數(shù)列表,包括那些沒有分配給函數(shù)聲明時(shí)定義的形式參數(shù)的多余參數(shù)。但這個(gè)數(shù)組,只有一個(gè)length屬性,它缺少所有的數(shù)組的方法。
返回
如果沒有返回值,則返回 undefined 。如果函數(shù)以在前面加上new 前綴的方式來(lái)調(diào)用,且返回值不是一個(gè)對(duì)象,則返回 this (該新對(duì)象)。
異常throw、try、catch:
try語(yǔ)句執(zhí)行一個(gè)代碼塊,并捕獲改代碼快拋出的任何一場(chǎng)。catch從句定義了一個(gè)新的變量,它將接受該異常對(duì)象。
throw 語(yǔ)句拋出一個(gè)異常。如果throw語(yǔ)句在一個(gè)try代碼塊重,那么控制權(quán)會(huì)跳到catch從句中。如果throw語(yǔ)句在函數(shù)中,則該函數(shù)調(diào)用被放棄,且控制權(quán)會(huì)跳到調(diào)用該函數(shù)的try語(yǔ)句的catch從句中。
var?add?=?function?(a,b){if?(typeof?a?!==?'number'?||?typeof?b?!==?'number'){throw?{"name"?:?"TypeError","message"?:?"add?needs?numbers" }; }return?a?+?b; } var?try_it?=?function?(){try?{add("seven"); } catch?(e){alert(e.name?+?"?:?"?+?e.message); } } try_it();給類型增加方法
Function.prototype.method?=?function(name,func){this.prototype[name]?=?func;return?this; };函數(shù)遞歸調(diào)用方法,實(shí)例:漢諾塔
回調(diào)
//樸素寫法request?=?prepare_the_request();response?=?send_request_synchronously(request);display(response);//回調(diào)寫法request?=?prepare_the_request();send_request_synchronously(request,function?(response){display(response);});函數(shù)模塊
函數(shù)套用
函數(shù)記憶
for?(var?i?=?0;?i?<=?10;i?++){alert("?i?(?"?+?i?"?)?:?"?+?fibonacci(i)); }//普通寫法,被調(diào)用29次,自己調(diào)用了11次,它自身調(diào)用了18次var?fibonacci?=?function(){var?memo?=?[0,1];var?fib?=??function?(n){if?(typeof?result?!==?"number"){result?=?fundamental(shell,n);memo[n]?=?result; }return?result; } return?fib; }//回調(diào)寫法var?memoizer?=?function?(memon,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); });第五章 繼承?
偽類
第六章 數(shù)組?
數(shù)組:Javascript 提供了一種擁有類數(shù)組(array-like)特性的對(duì)象。它把數(shù)組的下表編程字符串,用其作為屬性。明顯地比一個(gè)真正的數(shù)組慢但它可以更方便地使用。屬性的檢索和更新的方式與對(duì)象幾乎一樣,除了有一個(gè)可以用整數(shù)作為屬性名的特性外。
基本操作:
var?numbers1?=?[]; var?numbers2?=?["a","b","c","d"]; var?numbers3?=?[4,5,78748,6456,"dafd"];numbers3.length;numbers3.length?=?50;???//?直接通過(guò)修改數(shù)組長(zhǎng)度,重新給數(shù)組分配空間numbers1.push("go");????//?向數(shù)組末位添加一個(gè)元素delete?numbers2[2;];??//?這樣刪除之后,被刪元素后面的數(shù)組元素不會(huì)改變下標(biāo),會(huì)在數(shù)組中遺留一個(gè)空洞numbers2.splice(2,1); //?從數(shù)組中下標(biāo)為2的元素開始,刪除?1?個(gè)元素。對(duì)于大型數(shù)組,效率不高。?第七章 正則表達(dá)式?
正則表達(dá)式是一門簡(jiǎn)單語(yǔ)言的語(yǔ)法規(guī)范。以方法的形式被用于對(duì)字符串中的信息進(jìn)行查找、替換和提取操作。常用的方法有:regexp.exec、regexp.test 、string.match 、string.replace 、string.search 、string.split。
?
?
轉(zhuǎn)載于:https://my.oschina.net/maomi/blog/79108
總結(jié)
以上是生活随笔為你收集整理的【读书笔记】《Javascript语言精粹》的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络技术 几项技术!
- 下一篇: 使用Oracle SQL Develop