前端規(guī)范

1 前言

HTML 作為描述網(wǎng)頁(yè)結(jié)構(gòu)的超文本標(biāo)記語(yǔ)言恭朗,一直有著廣泛的應(yīng)用才菠。本文檔的目標(biāo)是使 HTML 代碼風(fēng)格保持一致驹吮,容易被理解和被維護(hù)针史。

2 代碼風(fēng)格

2.1 縮進(jìn)與換行

[強(qiáng)制] 使用 4 個(gè)空格做為一個(gè)縮進(jìn)層級(jí),不允許使用 2 個(gè)空格 或 tab 字符碟狞。

解釋:
對(duì)于非 HTML 標(biāo)簽之間的縮進(jìn)啄枕,比如 script 或 style 標(biāo)簽內(nèi)容縮進(jìn),與 script 或 style 標(biāo)簽的縮進(jìn)同級(jí)族沃。

示例:

<style>
/* 樣式內(nèi)容的第一級(jí)縮進(jìn)與所屬的 style 標(biāo)簽對(duì)齊 */
ul {
    padding: 0;
}
</style>
<ul>
    <li>first</li>
    <li>second</li>
</ul>
<script>
// 腳本代碼的第一級(jí)縮進(jìn)與所屬的 script 標(biāo)簽對(duì)齊
require(['app'], function (app) {
    app.init();
});
</script>

[建議] 每行不得超過(guò) 120 個(gè)字符频祝。

2.2 命名

[強(qiáng)制] class 必須單詞全字母小寫,單詞間以 - 分隔脆淹。

[強(qiáng)制] class 必須代表相應(yīng)模塊或部件的內(nèi)容或功能智润,不得以樣式信息進(jìn)行命名。

示例:

<!-- good -->
<div class="sidebar"></div>

<!-- bad -->
<div class="left"></div>

[強(qiáng)制] 元素 id 必須保證頁(yè)面唯一未辆。

解釋:

同一個(gè)頁(yè)面中窟绷,不同的元素包含相同的 id,不符合 id 的屬性含義咐柜。并且使用 document.getElementById 時(shí)可能導(dǎo)致難以追查的問(wèn)題兼蜈。

[建議] id 建議單詞全字母小寫攘残,單詞間以 - 分隔。同項(xiàng)目必須保持風(fēng)格一致为狸。

[建議] id歼郭、class 命名,在避免沖突并描述清楚的前提下盡可能短辐棒。

示例:

<!-- good -->
<div id="nav"></div>
<!-- bad -->
<div id="navigation"></div>

<!-- good -->
<p class="comment"></p>
<!-- bad -->
<p class="com"></p>

<!-- good -->
<span class="author"></span>
<!-- bad -->
<span class="red"></span>

[強(qiáng)制] 禁止為了 hook 腳本病曾,創(chuàng)建無(wú)樣式信息的 class

解釋:

不允許 class 只用于讓 JavaScript 選擇某些元素漾根,class 應(yīng)該具有明確的語(yǔ)義和樣式泰涂。否則容易導(dǎo)致 CSS class 泛濫。

使用 id辐怕、屬性選擇作為 hook 是更好的方式逼蒙。

[強(qiáng)制] 同一頁(yè)面,應(yīng)避免使用相同的 nameid寄疏。

解釋:

IE 瀏覽器會(huì)混淆元素的 idname 屬性是牢, document.getElementById 可能獲得不期望的元素。所以在對(duì)元素的 idname 屬性的命名需要非常小心陕截。

2.3 標(biāo)簽

[強(qiáng)制] 標(biāo)簽名必須使用小寫字母驳棱。

[強(qiáng)制] 對(duì)于無(wú)需自閉合的標(biāo)簽,不允許自閉合农曲。

解釋:

常見無(wú)需自閉合標(biāo)簽有 input蹈胡、brimg朋蔫、hr 等。

[強(qiáng)制] 對(duì) HTML5 中規(guī)定允許省略的閉合標(biāo)簽却汉,不允許省略閉合標(biāo)簽驯妄。

[強(qiáng)制] 標(biāo)簽使用必須符合標(biāo)簽嵌套規(guī)則。

解釋:

比如 div 不得置于 p 中合砂,tbody 必須置于 table 中青扔。

[建議] HTML 標(biāo)簽的使用應(yīng)該遵循標(biāo)簽的語(yǔ)義。

解釋:

下面是常見標(biāo)簽語(yǔ)義

  • p - 段落
  • h1,h2,h3,h4,h5,h6 - 層級(jí)標(biāo)題
  • strong,em - 強(qiáng)調(diào)
  • ins - 插入
  • del - 刪除
  • abbr - 縮寫
  • code - 代碼標(biāo)識(shí)
  • cite - 引述來(lái)源作品的標(biāo)題
  • q - 引用
  • blockquote - 一段或長(zhǎng)篇引用
  • ul - 無(wú)序列表
  • ol - 有序列表
  • dl,dt,dd - 定義列表

[建議] 在 CSS 可以實(shí)現(xiàn)相同需求的情況下不得使用表格進(jìn)行布局翩伪。

解釋:

在兼容性允許的情況下應(yīng)盡量保持語(yǔ)義正確性微猖。對(duì)網(wǎng)格對(duì)齊和拉伸性有嚴(yán)格要求的場(chǎng)景允許例外,如多列復(fù)雜表單缘屹。

[建議] 標(biāo)簽的使用應(yīng)盡量簡(jiǎn)潔凛剥,減少不必要的標(biāo)簽导帝。

2.4 屬性

[強(qiáng)制] 屬性名必須使用小寫字母客们。

[強(qiáng)制] 屬性值必須用雙引號(hào)包圍臭笆。

解釋:
不允許使用單引號(hào)丝蹭,不允許不使用引號(hào)。

[建議] 布爾類型的屬性犁享,建議不添加屬性值余素。

示例:

<input type="text" disabled>
<input type="checkbox" value="1" checked>

[建議] 自定義屬性建議以 xxx- 為前綴,推薦使用 data-炊昆。

解釋:使用前綴有助于區(qū)分自定義屬性和標(biāo)準(zhǔn)定義的屬性桨吊。

3 通用

3.1 DOCTYPE

[強(qiáng)制] 使用 HTML5doctype 來(lái)啟用標(biāo)準(zhǔn)模式,建議使用大寫的 DOCTYPE凤巨。

[建議] 啟用 IE Edge 模式视乐。

示例:
<meta http-equiv="X-UA-Compatible" content="IE=Edge">

[建議] 在 html 標(biāo)簽上設(shè)置正確的 lang 屬性。

解釋:
有助于提高頁(yè)面的可訪問(wèn)性磅甩,如:讓語(yǔ)音合成工具確定其所應(yīng)該采用的發(fā)音炊林,令翻譯工具確定其翻譯語(yǔ)言等。

示例:<html lang="zh-CN">

3.2 編碼

[強(qiáng)制] 頁(yè)面必須使用精簡(jiǎn)形式卷要,明確指定字符編碼渣聚。指定字符編碼的 meta 必須是 head 的第一個(gè)直接子元素。

解釋:見 HTML5 Charset能用嗎 一文僧叉。

示例:

<html>
    <head>
        <meta charset="UTF-8">
        ......
    </head>
    <body>
        ......
    </body>
</html>

[建議] HTML 文件使用無(wú) BOMUTF-8 編碼奕枝。

解釋:UTF-8編碼具有更廣泛的適應(yīng)性。BOM` 在使用程序或工具處理文件時(shí)可能造成不必要的干擾瓶堕。

3.3 CSS 和 JavaScript 引入

[強(qiáng)制] 引入 CSS 時(shí)必須指明 rel="stylesheet"隘道。

[建議] 引入 CSSJavaScript 時(shí)無(wú)須指明 type 屬性。

解釋:text/csstext/javascripttype 的默認(rèn)值郎笆。

[建議] 展現(xiàn)定義放置于外部 CSS 中谭梗,行為定義放置于外部 JavaScript 中。

解釋:結(jié)構(gòu)-樣式-行為的代碼分離宛蚓,對(duì)于提高代碼的可閱讀性和維護(hù)性都有好處激捏。

[建議] 在 head 中引入頁(yè)面需要的所有 CSS 資源。

解釋:在頁(yè)面渲染的過(guò)程中凄吏,新的CSS可能導(dǎo)致元素的樣式重新計(jì)算和繪制远舅,頁(yè)面閃爍。

[建議] JavaScript 應(yīng)當(dāng)放在頁(yè)面末尾痕钢,或采用異步加載图柏。

解釋:將 script 放在頁(yè)面中間將阻斷頁(yè)面的渲染。

4 head

4.1 title

[強(qiáng)制] 頁(yè)面必須包含 title 標(biāo)簽聲明標(biāo)題任连。

[強(qiáng)制] title 必須作為 head 的直接子元素蚤吹,并緊隨 charset 聲明之后。

解釋:title 中如果包含 ASCII 之外的字符随抠,瀏覽器需要知道字符編碼類型才能進(jìn)行解碼距辆,否則可能導(dǎo)致亂碼余佃。

4.2 favicon

[強(qiáng)制] 保證 favicon 可訪問(wèn)。

解釋:在未指定 favicon 時(shí)跨算,大多數(shù)瀏覽器會(huì)請(qǐng)求 Web Server 根目錄下的 favicon.ico 爆土。為了保證 favicon 可訪問(wèn),避免 404诸蚕,必須遵循以下兩種方法之一:

  1. 在 Web Server 根目錄放置 favicon.ico 文件步势。
  2. 使用 link 指定 favicon。

示例:
<link rel="shortcut icon" href="path/to/favicon.ico">

4.3 viewport

[建議] 若頁(yè)面欲對(duì)移動(dòng)設(shè)備友好背犯,需指定頁(yè)面的 viewport坏瘩。

解釋:viewport meta tag 可以設(shè)置可視區(qū)域的寬度和初始縮放大小,避免在移動(dòng)設(shè)備上出現(xiàn)頁(yè)面展示不正常漠魏。

比如倔矾,在頁(yè)面寬度小于 980px 時(shí),若需 iOS 設(shè)備友好柱锹,應(yīng)當(dāng)設(shè)置 viewport 的 width 值來(lái)適應(yīng)你的頁(yè)面寬度哪自。同時(shí)因?yàn)椴煌苿?dòng)設(shè)備分辨率不同,在設(shè)置時(shí)禁熏,應(yīng)當(dāng)使用 device-widthdevice-height 變量壤巷。

另外,為了使 viewport 正常工作瞧毙,在頁(yè)面內(nèi)容樣式布局設(shè)計(jì)上也要做相應(yīng)調(diào)整胧华,如避免絕對(duì)定位等。

5 圖片

[強(qiáng)制] 禁止 imgsrc 取值為空宙彪。延遲加載的圖片也要增加默認(rèn)的 src矩动。

解釋:src 取值為空,會(huì)導(dǎo)致部分瀏覽器重新加載一次當(dāng)前頁(yè)面释漆,參考:https://developer.yahoo.com/performance/rules.html#emptysrc

[建議] 避免為 img 添加不必要的 title 屬性悲没。

解釋:多余的 title 影響看圖體驗(yàn),并且增加了頁(yè)面尺寸灵汪。

[建議] 為重要圖片添加 alt 屬性。

解釋:可以提高圖片加載失敗時(shí)的用戶體驗(yàn)柑潦。

[建議] 添加 widthheight 屬性享言,以避免頁(yè)面抖動(dòng)。

[建議] 有下載需求的圖片采用 img 標(biāo)簽實(shí)現(xiàn)渗鬼,無(wú)下載需求的圖片采用 CSS 背景圖實(shí)現(xiàn)览露。

解釋:

  1. 產(chǎn)品 logo、用戶頭像譬胎、用戶產(chǎn)生的圖片等有潛在下載需求的圖片差牛,以 img 形式實(shí)現(xiàn)命锄,·
  2. 無(wú)下載需求的圖片,比如:icon偏化、背景脐恩、代碼使用的圖片等,盡可能采用 CSS 背景圖實(shí)現(xiàn)侦讨。

6 表單

6.1 控件標(biāo)題

[強(qiáng)制] 有文本標(biāo)題的控件必須使用 label 標(biāo)簽將其與其標(biāo)題相關(guān)聯(lián)驶冒。

有兩種方式:

  1. 將控件置于 label 內(nèi)。
  2. labelfor 屬性指向控件的 id韵卤。

推薦使用第一種骗污,減少不必要的 id。如果 DOM 結(jié)構(gòu)不允許直接嵌套沈条,則應(yīng)使用第二種需忿。

6.2 按鈕

[強(qiáng)制] 使用 button 元素時(shí)必須指明 type 屬性值。

解釋:button 元素的默認(rèn) typesubmit蜡歹,如果被置于 form 元素中屋厘,點(diǎn)擊后將導(dǎo)致表單提交。為顯示區(qū)分其作用方便理解季稳,必須給出 type 屬性擅这。

[建議] 盡量不要使用按鈕類元素的 name 屬性。

解釋:由于瀏覽器兼容性問(wèn)題景鼠,使用按鈕的 name 屬性會(huì)帶來(lái)許多難以發(fā)現(xiàn)的問(wèn)題仲翎。具體情況可參考此文

7 模板中的 HTML

[建議] 模板代碼的縮進(jìn)優(yōu)先保證 HTML 代碼的縮進(jìn)規(guī)則铛漓。

示例:

<!-- good -->
{if $display == true}
<div>
    <ul>
    {foreach $item_list as $item}
        <li>{$item.name}<li>
    {/foreach}
    </ul>
</div>
{/if}

<!-- bad -->
{if $display == true}
    <div>
        <ul>
    {foreach $item_list as $item}
        <li>{$item.name}<li>
    {/foreach}
        </ul>
    </div>
{/if}

[建議] 模板代碼應(yīng)以保證 HTML 單個(gè)標(biāo)簽語(yǔ)法的正確性為基本原則溯香。

示例:

<!-- good -->
<li class="{if $item.type_id == $current_type}focus{/if}">{ $item.type_name }</li>

<!-- bad -->
<li {if $item.type_id == $current_type} class="focus"{/if}>{ $item.type_name }</li>

[建議] 在循環(huán)處理模板數(shù)據(jù)構(gòu)造表格時(shí),若要求每行輸出固定的個(gè)數(shù)浓恶,建議先將數(shù)據(jù)分組玫坛,之后再循環(huán)輸出。

示例:

<!-- good -->
<table>
    {foreach $item_list as $item_group}
    <tr>
        {foreach $item_group as $item}
        <td>{ $item.name }</td>
        {/foreach}
    <tr>
    {/foreach}
</table>

<!-- bad -->
<table>
<tr>
    {foreach $item_list as $item}
    <td>{ $item.name }</td>
        {if $item@iteration is div by 5}
    </tr>
    <tr>
        {/if}
    {/foreach}
</tr>
</table>

8 CSS命名及書寫規(guī)范

CSS書寫順序
  1.位置屬性(position, top, right, z-index, display, float等)
  2.大小(width, height, padding, margin)
  3.文字系列(font, line-height, letter-spacing, color- text-align等)
  4.背景(background, border等)
  5.其他(animation, transition等)

CSS縮寫屬性
去掉小數(shù)點(diǎn)前的“0”

16進(jìn)制顏色代碼縮寫
簡(jiǎn)寫類名包晰,但前提是要讓人看懂你的命名才能簡(jiǎn)寫

連字符CSS選擇器命名規(guī)范
1.長(zhǎng)名稱或詞組可以使用中橫線來(lái)為選擇器命名湿镀。
  2.不建議使用“_”下劃線來(lái)命名CSS選擇器,為什么呢?
  輸入的時(shí)候少按一個(gè)shift鍵;
  瀏覽器兼容問(wèn)題 (比如使用_tips的選擇器命名伐憾,在IE6是無(wú)效的);

能良好區(qū)分JavaScript變量命名JS變量命名是用“_”

不要隨意使用Id
id在JS是唯一的勉痴,不能多次使用,而使用class類選擇器卻可以重復(fù)使用树肃,另外id的優(yōu)先級(jí)優(yōu)先與class蒸矛,所以id應(yīng)該按需使用

為選擇器添加狀態(tài)前綴
  有時(shí)候可以給選擇器添加一個(gè)表示狀態(tài)的前綴,讓語(yǔ)義更明了,比如下圖是添加了“.is-”前綴

減少選擇器層級(jí)雏掠,選擇器的嵌套最好不要超過(guò)三層斩祭,合理使用命名空間,避免命名沖突

.header .logo .text{} 可以優(yōu)化成 .haeder .logo-text{}

盡量不使用 !important 聲明
當(dāng)需要強(qiáng)制指定樣式且不允許任何場(chǎng)景覆蓋時(shí)乡话,通過(guò)標(biāo)簽內(nèi)聯(lián)和 !important 定義樣式摧玫。

利用CSS繼承減少代碼量
常見的可以繼承的屬性比如: color,font-size蚊伞,font-family等等
不可繼承的比如: position席赂,display,float等
不濫用浮動(dòng)
雖然浮動(dòng)不可避免时迫,但不可否認(rèn)很多css bug是由于浮動(dòng)而引起颅停。CSS Lint一旦檢測(cè)出樣式文件中有超過(guò)10次的浮動(dòng)便會(huì)提示警告。

js前端編碼規(guī)范

這是一份旨在增強(qiáng)團(tuán)隊(duì)的開發(fā)協(xié)作掠拳,提高代碼質(zhì)量和打造開發(fā)基石的編碼風(fēng)格規(guī)范癞揉,其中包含了 HTML, JavaScript 和 CSS/SCSS 這幾個(gè)部分。我們知道溺欧,當(dāng)一個(gè)團(tuán)隊(duì)開始指定并實(shí)行編碼規(guī)范的話喊熟,錯(cuò)誤就會(huì)變得更加顯而易見。如果一段特定的代碼不符合規(guī)范的話姐刁,它有可能只是代碼風(fēng)格錯(cuò)誤芥牌,而也有可能會(huì)是 bug。早期指定規(guī)范就使得代碼審核得以更好的開展聂使,并且可以更精確的地定位到錯(cuò)誤壁拉。只要開發(fā)者們能夠保證源代碼源文件都嚴(yán)格遵循規(guī)范,那接下去所使用的混淆柏靶、壓縮和編譯工具則可投其所好不盡相同弃理。

一、JavaScript 相關(guān)規(guī)范

命名
(1) 變量, 使用 Camel 命名法(駝峰命名法)屎蜓。

// 推薦的命名
 var isHotel,
 isHotelBeijing,
 // 不推薦的命名
 var is_Hotel,
 ishotelbeijing,

(2) 私有屬性痘昌、變量和方法以下劃線 _ 開頭。
var privateProperty
(3) 常量, 使用全部字母大寫炬转,單詞間下劃線(
)分隔的命名方式,通常用于ajax請(qǐng)求url辆苔,和一些不會(huì)改變的數(shù)據(jù)
var PLACE_TYPE = 'hotel';
(4) 函數(shù),使用 Camel 命名法, 函數(shù)的參數(shù), 使用 Camel 命名法扼劈。
(5) 類驻啤,使用 Pascal 命名法,即采用駱駝峰的命名且首字母大寫; 類的 方法 / 屬性, 使用 Camel 命名法
如:
function TextNode(value, engine) {
this.value = value;
this.engine = engine;
}

命名語(yǔ)法
(1) 類名,使用名詞测僵。
function Engine(options) {}
(2) 函數(shù)名街佑,使用動(dòng)賓短語(yǔ)。
function getStyle(element) {}
(3) boolean 類型的變量使用 is 或 has 開頭捍靠。
var isReady = false;
var hasMoreCommands = false;
(4) Promise 對(duì)象用動(dòng)賓短語(yǔ)的進(jìn)行時(shí)表達(dá)沐旨。
var loadingData = ajax.get('url');
loadingData.then(callback);
注釋
原則:
a) As short as possible(如無(wú)必要,勿增注釋):盡量提高代碼本身的清晰性榨婆、可讀性磁携。
b) As long as necessary(如有必要,盡量詳盡):合理的注釋良风、空行排版等谊迄,可以讓代碼更易閱讀、更具美感烟央。
(1) 單行注釋:必須獨(dú)占一行统诺。// 后跟一個(gè)空格,縮進(jìn)與下一行被注釋說(shuō)明的代碼一致疑俭。
(2) 多行注釋:避免使用 /.../ 這樣的多行注釋粮呢。有多行注釋內(nèi)容時(shí),使用多個(gè)單行注釋钞艇。
(3) 函數(shù)/方法注釋
函數(shù)/方法注釋必須包含函數(shù)說(shuō)明啄寡,有參數(shù)和返回值時(shí)必須使用注釋標(biāo)識(shí)。哩照;
參數(shù)和返回值注釋必須包含類型信息和說(shuō)明挺物;
當(dāng)函數(shù)是內(nèi)部函數(shù),外部不可訪問(wèn)時(shí)飘弧,可以使用 @inner 標(biāo)識(shí)识藤;

1.  /**
2.   * 函數(shù)描述
3.   *
4.   * @param {string} p1 參數(shù)1的說(shuō)明
5.   * @param {string} p2 參數(shù)2的說(shuō)明,比較長(zhǎng)
6.   *     那就換行了.
7.   * @param {number=} p3 參數(shù)3的說(shuō)明(可選)
8.   * @return {Object} 返回值描述
9.   */
10. function foo(p1, p2, p3) {
11.     var p3 = p3 || 10;
12.     return {
13.         p1: p1,
14.         p2: p2,
15.         p3: p3
16.     };
17. }

(4) 文件注釋
文件注釋用于告訴不熟悉這段代碼的讀者這個(gè)文件中包含哪些東西眯牧。 應(yīng)該提供文件的大體內(nèi)容, 它的作者, 依賴關(guān)系和兼容性信息蹋岩。如下:

/**
 * @fileoverview Description of file, its uses and information
 * about its dependencies.
 * @author user@meizu.com (Firstname Lastname)
 * Copyright 2009 Meizu Inc. All Rights Reserved.
 */

變量聲明:
總是使用 var(如果用ES6 則let ) 來(lái)聲明變量。如不指定 var学少,變量將被隱式地聲明為全局變量剪个,這將對(duì)變量難以控制
在同一個(gè)函數(shù)內(nèi)部,局部變量的聲明必須置于頂端版确。塊內(nèi)函數(shù)必須用局部變量聲明扣囊,切勿在循環(huán)中創(chuàng)建函數(shù)

// 錯(cuò)誤的寫法
 var call = function(name) {
     if (name == "hotel") {
         function foo() {
             console.log("hotel foo");
         }
     }
     foo && foo();
 }
// 推薦的寫法
 var call = function(name) {
     var foo;
     if (name == "hotel") {
         foo = function() {
             console.log("hotel foo");
         }
     }
     foo && foo();
 }

建議與禁止

(1) 分號(hào)
總是使用分號(hào),因?yàn)殡[式的代碼嵌套會(huì)引發(fā)難以察覺的問(wèn)題绒疗。當(dāng)然我們更要從根本上來(lái)杜絕這些問(wèn)題 侵歇,給自己的表達(dá)式加上分號(hào)吧
(2) (禁止)使用eval
eval() 不但混淆語(yǔ)境還很危險(xiǎn),總會(huì)有比這更好吓蘑、更清晰惕虑、更安全的另一種方案來(lái)寫你的代碼坟冲,因此盡量不要使用 evil 函數(shù);eg:采取$.parseJSON
(3) 除了三目運(yùn)算溃蔫,if,else等(禁止)簡(jiǎn)寫
(4) (推薦)使用局部變量緩存反復(fù)查找的對(duì)象(包括但不限于全局變量健提、dom查詢結(jié)果、作用域鏈較深的對(duì)象)

// 緩存對(duì)象
 var getComment = function() {
     var dom = $("#common-container"),               // 緩存dom
         appendTo = $.appendTo,                      // 緩存全局變量
         data = this.json.data;                      // 緩存作用域鏈較深的對(duì)象
 }

(5) 當(dāng)需要緩存this時(shí)必須推薦使用self變量進(jìn)行緩存

// 緩存this
 function Row(name) {
     var self = this;

     self.name = name;
     $(".row").click(function() {
         self.getName();
     });
 }

self是一個(gè)保留字伟叛,不過(guò)用它也沒關(guān)系私痹。在這里,看個(gè)人愛好吧统刮,可以用_this, that, me等這些詞紊遵,都行,但是團(tuán)隊(duì)開發(fā)的時(shí)候統(tǒng)一下比較好,建議大家用self;
(6) (不推薦)超長(zhǎng)函數(shù), 當(dāng)函數(shù)超過(guò)100行侥蒙,就要想想是否能將函數(shù)拆為兩個(gè)或多個(gè)函數(shù)
(7) 不要在 Array 上使用 for-in 循環(huán)
for-in 循環(huán)只用于 object/map/hash 的遍歷, 對(duì) Array 用 for-in 循環(huán)有時(shí)會(huì)出錯(cuò). 因?yàn)樗⒉皇菑?0 到 length - 1 進(jìn)行遍歷, 而是所有出現(xiàn)在對(duì)象及其原型鏈的鍵值暗膜。

// Not recommended
function printArray(arr) {
  for (var key in arr) {
    print(arr[key]);
  }
}
printArray([0,1,2,3]);  // This works.
var a = new Array(10);
printArray(a);  // This is wrong.
a = document.getElementsByTagName('*');
printArray(a);  // This is wrong.
a = [0,1,2,3];
a.buhu = 'wine';
printArray(a);  // This is wrong again.
a = new Array;
a[3] = 3;
printArray(a);  // This is wrong again.

//推薦
function printArray(arr) {
  var l = arr.length;
  for (var i = 0; i < l; i++) {
    print(arr[i]);
  }
}

(8) 操作符始終寫在前一行, 以免分號(hào)的隱式插入產(chǎn)生預(yù)想不到的問(wèn)題。

var x = a ? b : c;
var y = a ?
longButSimpleOperandB : longButSimpleOperandC;

    var z = a ?
        moreComplicatedB :
        moreComplicatedC;
. 操作符也是如此:
var x = foo.bar().
    doSomething().
    doSomethingElse();

(9) 條件(三元)操作符 (?:)
三元操作符用于替代 if 條件判斷語(yǔ)句鞭衩。

// Not recommended
if (val != 0) {
  return foo();
} else {
  return bar();
}
// Recommended
return val ? foo() : bar();

(10) && 和 ||
二元布爾操作符是可短路的, 只有在必要時(shí)才會(huì)計(jì)算到最后一項(xiàng)桦山。

// Not recommended
function foo(opt_win) {
  var win;
  if (opt_win) {
    win = opt_win;
  } else {
    win = window;
  }
  // ...
}
if (node) {
  if (node.kids) {
    if (node.kids[index]) {
      foo(node.kids[index]);
    }
  }
}

// Recommended
function foo(opt_win) {
  var win = opt_win || window;
  // ...
}

var kid = node && node.kids && node.kids[index];
if (kid) {
  foo(kid);
}

(11) 修改內(nèi)建對(duì)象的原型鏈
修改內(nèi)建的諸如 Object.prototype 和 Array.prototype 是被嚴(yán)厲禁止的。修改其它的內(nèi)建對(duì)象比如 Function.prototype醋旦,雖危害沒那么大恒水,但始終還是會(huì)導(dǎo)致在開發(fā)過(guò)程中難以 debug 的問(wèn)題,應(yīng)當(dāng)也要避免饲齐。
(12) 圓括號(hào)
一般在語(yǔ)法和語(yǔ)義上真正需要時(shí)才謹(jǐn)慎地使用圓括號(hào)钉凌。不要用在一元操作符上,例如 delete, typeof 和 void捂人,或在關(guān)鍵字之后御雕,例如 return, throw, case, new 等。
(13) 字符串
統(tǒng)一使用單引號(hào)(‘)滥搭,不使用雙引號(hào)(“)酸纲。這在創(chuàng)建 HTML 字符串非常有好處:

var msg = 'This is some HTML <div class="makes-sense"></div>';

(14) 自定義 toString() 方法
你可以通過(guò)自定義 toString() 來(lái)控制對(duì)象字符串化。這很好瑟匆,但你必須保證你的方法總是成功并不會(huì)有其它副作用闽坡。如果你的方法達(dá)不到這樣的標(biāo)準(zhǔn),那將會(huì)引發(fā)嚴(yán)重的問(wèn)題愁溜。如果 toString() 調(diào)用了一個(gè)方法疾嗅,這個(gè)方法做了一個(gè)斷言[3] ,當(dāng)斷言失敗冕象,它可能會(huì)輸出它所在對(duì)象的名稱代承,當(dāng)然對(duì)象也需要調(diào)用 toString()
(15) 異常
基本上你無(wú)法避免出現(xiàn)異常,特別是在做大型開發(fā)時(shí)(使用應(yīng)用開發(fā)框架等等)渐扮。在沒有自定義異常的情況下论悴,從有返回值的函數(shù)中返回錯(cuò)誤信息一定非常的棘手掖棉,更別提多不優(yōu)雅了。不好的解決方案包括了傳第一個(gè)引用類型來(lái)接納錯(cuò)誤信息膀估,或總是返回一個(gè)對(duì)象列表啊片,其中包含著可能的錯(cuò)誤對(duì)象。以上方式基本上是比較簡(jiǎn)陋的異常處理方式玖像。適時(shí)可做自定義異常處理。在復(fù)雜的環(huán)境中齐饮,你可以考慮拋出對(duì)象而不僅僅是字符串(默認(rèn)的拋出值)捐寥。

if(name === undefined) {
  throw {
    name: 'System Error',
    message: 'A name should always be specified!'
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市祖驱,隨后出現(xiàn)的幾起案子握恳,更是在濱河造成了極大的恐慌,老刑警劉巖捺僻,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乡洼,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡匕坯,警方通過(guò)查閱死者的電腦和手機(jī)束昵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)葛峻,“玉大人锹雏,你說(shuō)我怎么就攤上這事∈踅保” “怎么了礁遵?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)采记。 經(jīng)常有香客問(wèn)我佣耐,道長(zhǎng),這世上最難降的妖魔是什么唧龄? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任兼砖,我火速辦了婚禮,結(jié)果婚禮上既棺,老公的妹妹穿的比我還像新娘掖鱼。我一直安慰自己,他們只是感情好援制,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布戏挡。 她就那樣靜靜地躺著,像睡著了一般晨仑。 火紅的嫁衣襯著肌膚如雪褐墅。 梳的紋絲不亂的頭發(fā)上拆檬,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音妥凳,去河邊找鬼竟贯。 笑死,一個(gè)胖子當(dāng)著我的面吹牛逝钥,可吹牛的內(nèi)容都是我干的屑那。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼艘款,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼持际!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起哗咆,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蜘欲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后晌柬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體姥份,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年年碘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了澈歉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡屿衅,死狀恐怖闷祥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情傲诵,我是刑警寧澤凯砍,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站拴竹,受9級(jí)特大地震影響悟衩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜栓拜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一座泳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧幕与,春花似錦挑势、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至诫给,卻和暖如春香拉,著一層夾襖步出監(jiān)牢的瞬間啦扬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工凫碌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扑毡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓盛险,卻偏偏與公主長(zhǎng)得像瞄摊,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子苦掘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1:通用規(guī)范 tab鍵用兩個(gè)空格代替 因?yàn)樵诓煌到y(tǒng)的編輯工具對(duì)tab解析不一樣换帜,windows下的tab鍵是占四...
    糖心m閱讀 458評(píng)論 0 1
  • 通用規(guī)范 tab鍵用兩個(gè)空格代替 因?yàn)樵诓煌到y(tǒng)的編輯工具對(duì)tab解析不一樣,windows下的tab鍵是占四個(gè)空...
    米塔塔閱讀 415評(píng)論 0 7
  • 通用規(guī)范 tab鍵用兩個(gè)空格代替 因?yàn)樵诓煌到y(tǒng)的編輯工具對(duì)tab解析不一樣鸟蜡,windows下的tab鍵是占四個(gè)空...
    戈薇薇閱讀 470評(píng)論 0 1
  • 通用規(guī)范 tab鍵用兩個(gè)空格代替因?yàn)樵诓煌到y(tǒng)的編輯工具對(duì)tab解析不一樣,windows下的tab鍵是占四個(gè)空格...
    熊貓貓超人閱讀 29,919評(píng)論 17 113
  • 常用html挺邀、CSS揉忘、javascript前端命名規(guī)范無(wú)論是從技術(shù)角度還是開發(fā)視角,對(duì)于web前端開發(fā)規(guī)范文檔都有...
    krock01閱讀 265評(píng)論 0 1