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