摘要:為什么要編寫可維護(hù)的軟件生命周期的成本消耗在了維護(hù)上。相等具有強(qiáng)制類型轉(zhuǎn)換的機(jī)制。檢測(cè)字符串檢測(cè)數(shù)字檢測(cè)布爾值檢測(cè)檢測(cè)引用值引用值也稱為對(duì)象,檢測(cè)某個(gè)引用值的類型的官方最好的方法是使用運(yùn)算符。
為什么要編寫可維護(hù)的javascript?
軟件生命周期80%的成本消耗在了維護(hù)上。
幾乎所有的軟件維護(hù)者都不是它的最初作者。
編碼規(guī)范提高了軟件的可讀性,它讓工程師能夠快速且充分地理解新的代碼。
第一部分:編程風(fēng)格一、基本的格式化程序是寫給人讀的,只是偶爾讓計(jì)算機(jī)執(zhí)行以下。 ——高德納
如何處理縮進(jìn)是幾乎所有語(yǔ)言首先討論的,縮進(jìn)甚至關(guān)系到軟件工程師的價(jià)值觀!
第一種縮進(jìn):使用制表符進(jìn)行縮進(jìn)。例如:jQuery核心風(fēng)格,Dojo編程風(fēng)格。
第二種縮進(jìn):使用空格符進(jìn)行縮進(jìn)。例如:Goolge的javascript規(guī)定使用兩個(gè)空格縮進(jìn)。
推薦:4個(gè)空格字符為一個(gè)縮進(jìn)層級(jí),可以在編輯器中配置Tab鍵插入4個(gè)空格。
你加沒加分號(hào)代碼可能都會(huì)正常運(yùn)行,沒看到這里之前,你可能不知道這是分析器的自動(dòng)分號(hào)插入機(jī)制(ASI)在偷偷的幫你干活。常言道:常在河邊走,哪有不濕鞋?看看下面的代碼。
function getData() { return { text: "看看不加分號(hào)的后果!" } } ASI會(huì)解析成下面的樣子: function getData() { return ; { text: "看看不加分號(hào)的后果!" }; }
所以如果調(diào)用上面的getData的方法,返回的就是undefined。但是這樣不能全怪分號(hào),誰讓你把花括號(hào)寫到下面一行的?(反正我看到有第一個(gè)花括號(hào)跟之前的語(yǔ)句不在一行的,我就要暴走。)
//這段代碼工作正常,盡管沒有分號(hào) function getData() { return { text: "看看不加分號(hào)的后果!" } }
如果一行多于80個(gè)字符,應(yīng)當(dāng)在一個(gè)運(yùn)算符(逗號(hào),加號(hào)等)后換行。下一行應(yīng)當(dāng)增加兩級(jí)縮進(jìn)。
計(jì)算機(jī)科學(xué)只存在兩個(gè)難題:緩存失效和命名。
ECMAScript遵照了小駝峰的命名法,所謂小駝峰,官方稱之為“駝峰大小寫命名法(Camel Case)”,是由小寫字母開始的,后續(xù)每個(gè)單詞首字母都大寫。
//例如 var thisIsMyName;
變量命名前綴應(yīng)該是名詞。函數(shù)名前綴應(yīng)該是動(dòng)詞。
//變量 var myName = "chen"; //函數(shù)名 function getName() { return myName; }
在ECMAScript6之前,javascript中沒有真正的常量概念。根據(jù)C語(yǔ)言的樣子,約定使用大寫字母和下劃線來命名,下劃線用以分割單詞。
var MAX_COUNT = 10; //現(xiàn)在我們應(yīng)該也可以這樣定義常量 const MAX_COUNT = 10;
構(gòu)造函數(shù)的命名遵照大駝峰命名法(Pascal Case),為什么?因?yàn)楦镜卣Z(yǔ)言保持一致的命名約定,new RegExp(),正則本身就是一個(gè)內(nèi)置的構(gòu)造函數(shù),看見大駝峰了木有?
科普一下:Pascal Case 和 Camel Case都表示“駝峰大小寫”,區(qū)別在于:
Pascal Case是以大寫字母開始,所以也叫大駝峰,例如:AnotherName;
Camel Case是以小寫字母開始,之后的單詞首字母大寫,所以也叫小駝峰,例如:anotherName,之前在命名的那塊提到過小駝峰。
直接量可以這么理解,它是程序中可以直接使用的數(shù)據(jù),沒有進(jìn)行特別的封裝。
2 //數(shù)字直接量 "其心" //字符串直接量 [1,2,3] //數(shù)組直接量 true //布爾型直接量 {name: "其心"} //對(duì)象直接量 (function(){})() //函數(shù)直接量 /*分割線*/ new String("其心") //這就不是直接量
在直接量里著重說一下null,我就經(jīng)常誤解它,用的很隨意,現(xiàn)在我明確了解了,應(yīng)該在下列場(chǎng)景中使用它。
用來初始化一個(gè)變量,這個(gè)變量可能賦值給一個(gè)對(duì)象。
用來和一個(gè)已經(jīng)初始化的變量比較,這個(gè)變量可以是也可以不是一個(gè)對(duì)象。
當(dāng)函數(shù)的參數(shù)期望是對(duì)象時(shí),用作參數(shù)出入。
當(dāng)函數(shù)的返回值期望是對(duì)象時(shí),用作返回值傳出。
理解null最好的方式是讓他們當(dāng)做對(duì)象的占位符。
直接量的用法簡(jiǎn)潔高效,是值得提倡的,這一點(diǎn)謹(jǐn)記。
二、注釋單行注釋有三種使用方法:
獨(dú)占一行的注釋,用來解釋下一行代碼。這行注釋之前總要有一個(gè)空行,且縮進(jìn)層級(jí)和下一行代碼保持一致。
// 好的寫法 function print(){ // 控制臺(tái)輸出數(shù)字1 console.log(1); }
在代碼行的尾部的注釋。代碼結(jié)束到注釋之間至少有一個(gè)縮進(jìn)。注釋(包括之前代碼部分)不應(yīng)當(dāng)超過單行最大字符數(shù)限制,如果超過了,就講這條注釋放置于當(dāng)前代碼的上方。
被注釋掉的打斷代碼。
//好的寫法 // function print(){ // console.log(1); // }
比較青睞Java風(fēng)格的多行注釋
/* *這是一段注釋 *這段注釋包含兩行文本 */
多行注釋之前也應(yīng)該有一個(gè)空行,且縮進(jìn)層級(jí)和其描述的代碼保持一致。
多提一點(diǎn)就是文檔的注釋,多行注釋以單斜線加雙星號(hào)(/**)開始,接下來是描述信息,其中使用@符號(hào)來表示一個(gè)或多個(gè)屬性。
/** * 提交JSON數(shù)據(jù) * @param actionUrl 交互的URL * @param json JSON數(shù)據(jù) * @param postSuccessFn 提交成功的回調(diào)函數(shù) * @param postFailFn 提交失敗的方法 * @param isAsync 是否異步提交,true:是 * @param timeout 請(qǐng)求時(shí)限 */三、語(yǔ)句和表達(dá)式
首先說一點(diǎn),見到下面兩種寫法,都是合法的JavaScript的代碼,但是不提倡使用。
// 不好的寫法 if(condition) doSomething(); // 不好的寫法 if(condition) doSomething();
第一種風(fēng)格是,將左花括號(hào)放置在塊語(yǔ)句中第一句代碼的末尾。這種風(fēng)格繼承自Java。
if (condition) { doSomething(); }else { doSomethingElse(); }
第二種風(fēng)格是,將花括號(hào)放置于塊語(yǔ)句首行的下一行。這是隨著C#流行起來的。
if (condition) { doSomething(); }else { doSomethingElse(); }
為了避免導(dǎo)致錯(cuò)誤的分號(hào)自動(dòng)插入(還記得之前說過的“ASI”么),推薦使用第一種花括號(hào)對(duì)齊方式。
對(duì)于switch的縮進(jìn)之類可以直接用編輯器默認(rèn)的,只提一點(diǎn)就是,如果程序沒有默認(rèn)的行為時(shí),default是可以被省略的。
四、變量、函數(shù)和運(yùn)算符1、變量
建議將局部變量的定義作為函數(shù)內(nèi)第一條語(yǔ)句,推薦使用單個(gè)var語(yǔ)句,每個(gè)變量的初始化獨(dú)占一行。對(duì)于沒有初始化的變量來說,它們應(yīng)當(dāng)出現(xiàn)在var語(yǔ)句的尾部。
function doSomething(items) { var value = 10, result = value + 10, i, len; for(i = 0,len = items.length; i < len; i++){ doOtherSomething(items[i]); } }
需要注意,函數(shù)聲明應(yīng)當(dāng)在條件語(yǔ)句的外部使用。例如:
//不好的寫法,大部分瀏覽器會(huì)自動(dòng)使用第二個(gè)聲明,并不會(huì)根據(jù)condition來做判斷。 if (condition) { function doSomething() { alert("Hi!"); } } else { function doSomething() { alert("Yo!"); } }
JavaScript具有強(qiáng)制類型轉(zhuǎn)換的機(jī)制。
數(shù)字和字符串比較,字符串會(huì)首先轉(zhuǎn)換為數(shù)字,然后執(zhí)行比較。
// 比較數(shù)字5和字符串5 console.log(5 == "5"); // true // 比較數(shù)字25和十六進(jìn)制的字符串25 console.log(25 == "0x19"); // true
一個(gè)布爾值和數(shù)字比較,布爾值會(huì)首先轉(zhuǎn)化為數(shù)字,然后進(jìn)行比較,false是0,true是1。
// 比較數(shù)字1和true console.log(1 == true); // true // 比較數(shù)字0和false console.log(0== false); // true //比較數(shù)字2和true console.log(2 == true); // false
比較一個(gè)值是對(duì)象而另一個(gè)不是,會(huì)首先調(diào)用對(duì)象的valueOf()方法得到原始類型在進(jìn)行比較。如果沒有定義valueOf(),則調(diào)用toString()。
由于強(qiáng)制類型轉(zhuǎn)換的緣故,推薦用===或者!==,不應(yīng)當(dāng)使用==或者!=
JavaScript有5中簡(jiǎn)單的原始類型:字符串、數(shù)字、布爾值、null和undefined。最佳的選擇是用typeof運(yùn)算符,返回一個(gè)值的類型的字符串。
用typeof檢測(cè)一下4種原始值類型是非常安全的。
//檢測(cè)字符串 if (typeof name === "string") { anotherName = name.substring(3); } //檢測(cè)數(shù)字 if (typeof count === "number") { updateCount(count); } //檢測(cè)布爾值 if (typeof found === "boolean" && found){ message("Found!"); } //檢測(cè)underfined if (typeof MyApp=== "undefined") { MyApp = {}; }
引用值也稱為對(duì)象,檢測(cè)某個(gè)引用值的類型的官方最好的方法是使用instanceof運(yùn)算符。但是它不僅檢測(cè)構(gòu)造這個(gè)對(duì)象的構(gòu)造器,還檢測(cè)原型鏈。因?yàn)槊總€(gè)對(duì)象都繼承自O(shè)bject,因此每個(gè)對(duì)象的 value instanceof Object都會(huì)返回true。
var now = new Date(); console.log(now instanceof object); // true console.log(now instanceof Date) // true
最開始是判斷sort()方法在不在。
function isArray(value) { return typeof value.sort === "function"; }
然后有了一種比較優(yōu)雅的解決方案。
function isArray() { return Object.prototype.toString.call(value) === "[object Array]"; }
再后來ECMAScript5將Array.isArray()正式引入JavaScript。
判斷屬性是否存在的最好的方法是使用in運(yùn)算符。in運(yùn)算符只會(huì)簡(jiǎn)單地判斷屬性是否存在,而不會(huì)去讀屬性的值。但是檢測(cè)出來的屬性可以是對(duì)象自身的,也可以是繼承來的。
var object = { count: 0, related: null }; if ("count" in object) { //這里的代碼會(huì)執(zhí)行 }
如果只檢查對(duì)象自身的某個(gè)屬性是否存在,就使用hasOwnProperty()方法。
六、配置數(shù)據(jù)分離配置數(shù)據(jù)類似:
URL
需要展現(xiàn)給用戶的字符串
重復(fù)的值
設(shè)置(比如每頁(yè)的配置項(xiàng))
任何可能發(fā)生變更的值
類似于各種工具化文件的config。
Error: 所有的錯(cuò)誤類型。實(shí)際上引擎從來不會(huì)拋出該類型的錯(cuò)誤。
EvalError: 通過eval()函數(shù)執(zhí)行代碼發(fā)生錯(cuò)誤時(shí)拋出。
RangeError: 一個(gè)數(shù)字超出它的邊界時(shí)拋出。
ReferenceError: 期望的對(duì)象不存在時(shí)拋出。
SyntaxError: 給eval()函數(shù)傳遞的代碼中有語(yǔ)法錯(cuò)誤時(shí)拋出。
TypeError: 變量不是期望的類型時(shí)拋出。
八、阻止修改屬性防止擴(kuò)展
禁止為對(duì)象“添加”屬性和方法,但已存在的屬性和方法是可以被修改或刪除。
Object.preventExtension(); // 鎖定對(duì)象 Object.isExtensible(); // 判斷對(duì)象是否被鎖定
密封
類似“防止擴(kuò)展”,而且禁止為對(duì)象“刪除”已存在的屬性和方法。
Object.seal(); // 密封對(duì)象 Object.isSealed(); // 檢測(cè)一個(gè)對(duì)象是否已被密封
凍結(jié)
類似“密封”,而且禁止為對(duì)象“刪除”已存在的屬性和方法。
Object.freeze(); // 凍結(jié)對(duì)象 Object.isFrozen(); // 判斷一個(gè)對(duì)象是否已被凍結(jié)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/50396.html
摘要:最近讀完編寫可維護(hù)的,讓我受益匪淺,它指明了編碼過程中,需要注意的方方面面,在團(tuán)隊(duì)協(xié)作中特別有用,可維護(hù)性是一個(gè)非常大的話題,這本書是一個(gè)不錯(cuò)的起點(diǎn)。擴(kuò)展閱讀編寫可維護(hù)的歡迎來到石佳劼的博客,如有疑問,請(qǐng)?jiān)谠脑u(píng)論區(qū)留言,我會(huì)盡量為您解答。 最近讀完《編寫可維護(hù)的JavaScript》,讓我受益匪淺,它指明了編碼過程中,需要注意的方方面面,在團(tuán)隊(duì)協(xié)作中特別有用,可維護(hù)性是一個(gè)非常大的話...
摘要:沒有初始化的變量都會(huì)賦值為盡量避免使用因?yàn)闆]有聲明的變量也會(huì)判斷為類型。對(duì)象直接量,不建議使用構(gòu)造函數(shù)創(chuàng)建對(duì)象數(shù)組直接量,不建議使用構(gòu)造函數(shù)創(chuàng)建數(shù)組 編寫可維護(hù)代碼的重要性 程序是給人讀的,只是偶爾給機(jī)器運(yùn)行一下 1、軟件生命周期的80%成本是發(fā)生在為維護(hù)上;2、幾乎所有的軟件維護(hù)者都不是最初的創(chuàng)建者;3、編寫規(guī)范提高了軟件代碼的可讀性,它讓軟件工程師快速充分的理解代碼; 編寫規(guī)范 縮...
摘要:盡管在類庫(kù)中,可能會(huì)經(jīng)常用到通常和操作有關(guān),另外三種用法即使也非常罕見。一個(gè)通用的原則是,禁止使用,并且只在別無他法時(shí)使用,。和也是可以使用的,但不要用字符串形式而要用函數(shù) 再javascript中,eval()的參數(shù)是一個(gè)字符串,eval()會(huì)將傳入的字符串當(dāng)做代碼來執(zhí)行,開發(fā)者可以通過這個(gè)函數(shù)來載入外部的javascript代碼,活著隨機(jī)生成Javascript代碼并執(zhí)行它,比如:...
摘要:寫在前面新司機(jī)最近讀完編寫可維護(hù)的,學(xué)到不少東西。書分為編程風(fēng)格編程實(shí)踐自動(dòng)化三個(gè)部分。編程風(fēng)格并不是絕對(duì)的,每個(gè)人或團(tuán)隊(duì)都有自己的編程風(fēng)格,但知道哪些地方需要注意的話,還是有助于新司機(jī)完成代碼風(fēng)格的轉(zhuǎn)變。 寫在前面 新司機(jī)最近讀完《編寫可維護(hù)的JavaScript》,學(xué)到不少東西。書分為編程風(fēng)格、編程實(shí)踐、自動(dòng)化三個(gè)部分。其中編程風(fēng)格是你的代碼格式約定,統(tǒng)一的格式不僅僅有利于團(tuán)隊(duì),也...
摘要:如果值是基本類型,則用操作符檢查其類型。總結(jié)所有編程語(yǔ)言都需要可維護(hù)性良好的代碼,這個(gè)很重要,因?yàn)榇蟛糠珠_發(fā)人員都花費(fèi)大量時(shí)間維護(hù)他人的代碼。 o(╯□╰)o 這并不是什么史詩(shī)巨作,沒有非常深入去挖掘這類問題,只是從平常的JS代碼習(xí)慣,參考書籍總結(jié)而來,希望對(duì)你有幫助的! 今天的web應(yīng)用大至成千上萬行的javascript代碼,執(zhí)行各種復(fù)雜的過程,這種演化讓我們開發(fā)者必...
摘要:由于第四章太稀松平常了于是就直接跳到第五章了這里我就草草的說一下第四章的幾個(gè)點(diǎn)吧在嚴(yán)格模式的應(yīng)用下不推薦將用在全局作用域中相等推薦盡量使用和守則如果是在沒有別的方法來完成當(dāng)前任務(wù)這時(shí)可以使用原始包裝類型不推薦創(chuàng)建類型時(shí)用等創(chuàng)建類型從這一章節(jié) 由于第四章太稀松平常了, 于是就直接跳到第五章了.這里我就草草的說一下第四章的幾個(gè)點(diǎn)吧 在嚴(yán)格模式的應(yīng)用下 不推薦將use strict;用在全...
閱讀 1681·2021-11-19 09:40
閱讀 2937·2021-09-24 10:27
閱讀 3224·2021-09-02 15:15
閱讀 1886·2019-08-30 15:54
閱讀 1209·2019-08-30 15:54
閱讀 1376·2019-08-30 13:12
閱讀 640·2019-08-28 18:05
閱讀 2805·2019-08-27 10:53