掃二維碼與項(xiàng)目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
一個好的程序員肯定是要能書寫可維護(hù)的代碼,而不是一次性的代碼,怎么能讓團(tuán)隊(duì)當(dāng)中其他人甚至一段時間時候你再看你某個時候?qū)懙拇a也能看懂呢,這就需要規(guī)范你的代碼了。我是有一點(diǎn)強(qiáng)迫癥的人,上周我們后端給我了一個CanUsename的接口(該接口的目的是判斷輸入的目的地是否是4級目的地),我真的是崩潰的。我只是覺得這個名字不夠語義化,但是讓我自己想一個名字我又想不出來,于是我就在想,如果有一套命名規(guī)范的話,那么以后起名字就不用發(fā)愁了,直接按照規(guī)范來就好了

成都創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、通渭網(wǎng)絡(luò)推廣、微信平臺小程序開發(fā)、通渭網(wǎng)絡(luò)營銷、通渭企業(yè)策劃、通渭品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;成都創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供通渭建站搭建服務(wù),24小時服務(wù)熱線:18982081108,官方網(wǎng)址:www.cdcxhl.com
不推薦:
推薦
命名方式: 小駝峰式命名方法命名規(guī)范: 類型+對象描述的方式,如果沒有明確的類型,就可以使前綴為名詞
推薦
- var tableTitle = "LoginTable"
不推薦
- var getTitle = "LoginTable"
命名方式: 小駝峰方式 ( 構(gòu)造函數(shù)使用大駝峰命名法 )命名規(guī)則: 前綴為動詞
推薦:
- //是否可閱讀
- function canRead(){
- return true;
- }
- //獲取姓名
- function getName{
- return this.name
- }
命名方法: 全部大寫命名規(guī)范: 使用大寫字母和下劃線來組合命名,下劃線用以分割單詞。推薦:
- var MAX_COUNT = 10;
- var URL = 'http://www.baidu.com';
推薦(將name換成this是不是更熟悉了呢)
- function Student(name) {
- var _name = name; // 私有成員
- // 公共方法
- this.getName = function () {
- return _name;
- }
- // 公共方式
- this.setName = function (value) {
- _name = value;
- }
- }
- var st = new Student('tom');
- st.setName('jerry');
- console.log(st.getName()); // => jerry:輸出_name私有變量的值
推薦 :
- // 調(diào)用了一個函數(shù);1)單獨(dú)在一行
- setTitle();
- var maxCount = 10; // 設(shè)置最大量;2)在代碼后面注釋
- // setName(); // 3)注釋代碼
函數(shù)(方法)注釋也是多行注釋的一種,但是包含了特殊的注釋要求,參照 javadoc(百度百科)語法:
- /**
- * 函數(shù)說明
- * @關(guān)鍵字
- */復(fù)制代碼
常用注釋關(guān)鍵字
推薦 :
- /**
- - 合并Grid的行
- - @param grid {Ext.Grid.Panel} 需要合并的Grid
- - @param cols {Array} 需要合并列的Index(序號)數(shù)組;從0開始計(jì)數(shù),序號也包含。
- - @param isAllSome {Boolean} :是否2個tr的cols必須完成一樣才能進(jìn)行合并。true:完成一樣;false(默認(rèn)):不完全一樣
- - @return void
- - @author polk6 2015/07/21
- - @example
- - _________________ _________________
- - | 年齡 | 姓名 | | 年齡 | 姓名 |
- - ----------------- mergeCells(grid,[0]) -----------------
- - | 18 | 張三 | => | | 張三 |
- - ----------------- - 18 ---------
- - | 18 | 王五 | | | 王五 |
- - ----------------- -----------------
- */
- function mergeCells(grid, cols, isAllSome) {
- // Do Something
- }
使用 HTML5 的文檔聲明類型 :
說到j(luò)s和css的位置,大家應(yīng)該都知道js放在下面,css放在上面。但是,如果你的項(xiàng)目只需要兼容ie10+或者只是在移動端訪問,那么可以使用HTML5的新屬性async,將腳本文件放在
內(nèi)兼容老舊瀏覽器(IE9-)時:腳本引用寫在 body 結(jié)束標(biāo)簽之前,并帶上 async 屬性。這雖然在老舊瀏覽器中不會異步加載腳本,但它只阻塞了 body 結(jié)束標(biāo)簽之前的 DOM 解析,這就大大降低了其阻塞影響。而在現(xiàn)代瀏覽器中:腳本將在 DOM 解析器發(fā)現(xiàn) body 尾部的 script 標(biāo)簽才進(jìn)行加載,此時加載屬于異步加載,不會阻塞 CSSOM(但其執(zhí)行仍發(fā)生在 CSSOM 之后)。綜上所述,所有瀏覽器中推薦:只兼容現(xiàn)代瀏覽器推薦:
我們一直都在說語義化編程,語義化編程,但是在代碼中很少有人完全使用正確的元素。使用語義化標(biāo)簽也是有理由SEO的。
語義化是指:根據(jù)元素其被創(chuàng)造出來時的初始意義來使用它。意思就是用正確的標(biāo)簽干正確的事,而不是只有div和span。
不推薦:
- My page title
All news articlesBad article
Introduction sub-title This is a very bad example for HTML semantics I think I'm more on the side and should not receive the main credits- This article was created by David
2014-01-01 00:00- Related sections: Events, Public holidays
- Copyright 2014
推薦
標(biāo)簽的 alt 屬性指定了替代文本,用于在圖像無法顯示或者用戶禁用圖像顯示時,代替圖像顯示在瀏覽器中的內(nèi)容。假設(shè)由于下列原因用戶無法查看圖像,alt 屬性可以為圖像提供替代的信息:
從SEO角度考慮,瀏覽器的爬蟲爬不到圖片的內(nèi)容,所以我們要有文字告訴爬蟲圖片的內(nèi)容
盡量在文檔和模板中只包含結(jié)構(gòu)性的 HTML;而將所有表現(xiàn)代碼,移入樣式表中;將所有動作行為,移入腳本之中。在此之外,為使得它們之間的聯(lián)系盡可能的小,在文檔和模板中也盡量少地引入樣式和腳本文件。建議:
不推薦:
- See the square next to me?
- css 代碼:
- .text-box > .square {
- display: inline-block;
- width: 1rem;
- height: 1rem;
- background-color: red;
- }
推薦
- html 代碼:
- See the square next to me?
- css 代碼:
- /* We use a :before pseudo element to solve the design problem of placing a colored square in front of the text content */
- .text-box:before {
- content: "";
- display: inline-block;
- width: 1rem;
- height: 1rem;
- background-color: red;
- }
圖片和 SVG 圖形能被引入到 HTML 中的唯一理由是它們呈現(xiàn)出了與內(nèi)容相關(guān)的一些信息。
不推薦
- html 代碼:
- See the square next to me?
推薦
- html 代碼:
- See the square next to me?
- css 代碼:
- /* We use a :before pseudo element with a background image to solve the problem */
- .text-box:before {
- content: "";
- display: inline-block;
- width: 1rem;
- height: 1rem;
- background: url(square.svg) no-repeat;
- background-size: 100%;
- }
防止全局命名空間被污染,我們通常的做法是將代碼包裹成一個 IIFE(Immediately-Invoked Function Expression),創(chuàng)建獨(dú)立隔絕的定義域。也使得內(nèi)存在執(zhí)行完后立即釋放。
IIFE 還可確保你的代碼不會輕易被其它全局命名空間里的代碼所修改(i.e. 第三方庫,window 引用,被覆蓋的未定義的關(guān)鍵字等等)。不推薦:
- var x = 10,
- y = 100;
- // Declaring variables in the global scope is resulting in global scope pollution. All variables declared like this
- // will be stored in the window object. This is very unclean and needs to be avoided.
- console.log(window.x + ' ' + window.y);
推薦
- // We declare a IIFE and pass parameters into the function that we will use from the global space
- (function(log, w, undefined){
- 'use strict';
- var x = 10,
- y = 100;
- // Will output 'true true'
- log((w.x === undefined) + ' ' + (w.y === undefined));
- }(window.console.log, window));
推薦的IIFE寫法:
- (function(){
- 'use strict';
- // Code goes here
- }());
如果你想引用全局變量或者是外層 IIFE 的變量,可以通過下列方式傳參:
- (function($, w, d){
- 'use strict';
- $(function() {
- w.alert(d.querySelectorAll('div').length);
- });
- }(jQuery, window, document));復(fù)制代碼
ECMAScript 5 嚴(yán)格模式可在整個腳本或獨(dú)個方法內(nèi)被激活。它對應(yīng)不同的 javascript 語境會做更加嚴(yán)格的錯誤檢查。嚴(yán)格模式也確保了 javascript 代碼更加的健壯,運(yùn)行的也更加快速。
嚴(yán)格模式會阻止使用在未來很可能被引入的預(yù)留關(guān)鍵字。
你應(yīng)該在你的腳本中啟用嚴(yán)格模式,最好是在獨(dú)立的 IIFE 中應(yīng)用它。避免在你的腳本第一行使用它而導(dǎo)致你的所有腳本都啟動了嚴(yán)格模式,這有可能會引發(fā)一些第三方類庫的問題。
總是使用 var 來聲明變量。如不指定 var,變量將被隱式地聲明為全局變量,例如
- var a = b = 0; //b會被隱式的創(chuàng)建為全局變量復(fù)制代碼
所以,請總是使用 var 來聲明變量,并且使用單var模式(將所有的變量在函數(shù)最前面只使用一個var定義)。例如:
- (function (){
- 'use strict'
- var a = 0,
- b = 0,
- c = 0,
- i,
- j,
- myObject();
- }())
采用嚴(yán)格模式帶來的好處是,當(dāng)你手誤輸入錯誤的變量名時,它可以通過報(bào)錯信息來幫助你定位錯誤出處。
javascript會自動將函數(shù)作用域內(nèi)的變量和方法的定義提前(只是提前聲明,賦值還是在原處)例如:
- (function(log){
- 'use strict';
- var a = 10;
- for(var i = 0; i < a; i++) {
- var b = i * i;
- log(b);
- }
- if(a === 10) {
- var f = function() {
- log(a);
- };
- f();
- }
- function x() {
- log('Mr. X!');
- }
- x();
- }(window.console.log));
提升后的js
- (function(log){
- 'use strict';
- // All variables used in the closure will be hoisted to the top of the function
- var a,
- i,
- b,
- f;
- // All functions in the closure will be hoisted to the top
- function x() {
- log('Mr. X!');
- }
- a = 10;
- for(i = 0; i < a; i++) {
- b = i * i;
- log(b);
- }
- if(a === 10) {
- // Function assignments will only result in hoisted variables but the function body will not be hoisted
- // Only by using a real function declaration the whole function will be hoisted with its body
- f = function() {
- log(a);
- };
- f();
- }
- x();
- }(window.console.log));
總是使用 === 精確的比較操作符,避免在判斷的過程中,由 JavaScript 的強(qiáng)制類型轉(zhuǎn)換所造成的困擾。例如:
- (function(log){
- 'use strict';
- log('0' == 0); // true
- log('' == false); // true
- log('1' == true); // true
- log(null == undefined); // true
- var x = {
- valueOf: function() {
- return 'X';
- }
- };
- log(x == 'X');
- }(window.console.log));
==等同操作符
- console.log( false == null ) // false
- console.log( false == undefined ) // false
- console.log( false == 0 ) // true
- console.log( false == '' ) // true
- console.log( false == NaN ) // false
- console.log( null == undefined ) // true
- console.log( null == 0 ) // false
- console.log( null == '' ) // false
- console.log( null == NaN ) // false
- console.log( undefined == 0) // false
- console.log( undefined == '') // false
- console.log( undefined == NaN) // false
- console.log( 0 == '' ) // true
- console.log( 0 == NaN ) // false
總結(jié)一下==
==, >, <, +, -, ... 這些操作符所造成的隱式類型轉(zhuǎn)換都是無副作用的,它不會改變變量本身保存的值。,但是,如果你覆寫某個對象的 valueOf/toString的話,==就會產(chǎn)生副作用.
例如:
- Array.prototype.valueOf = function() {
- this[0]++;
- return this;
- }
- var x = [1, 2, 3];
- x == 0;
- console.log(x); // [2, 2, 3]復(fù)制代碼
===操作符:
輯操作符 || 和 && 也可被用來返回布爾值。如果操作對象為非布爾對象,那每個表達(dá)式將會被自左向右地做真假判斷?;诖瞬僮?,最終總有一個表達(dá)式被返回回來。這在變量賦值時,是可以用來簡化你的代碼的。例如:如果x不存在且y不存在,x=1;如果x存在y存在,x = y
- if(!x) {
- if(!y) {
- x = 1;
- } else {
- x = y;
- }
- }
等同于:
x = x || y || 1;復(fù)制代碼這一小技巧經(jīng)常用來給方法設(shè)定默認(rèn)的參數(shù)。
- (function(log){
- 'use strict';
- function multiply(a, b) {
- a = a || 1;
- b = b || 1;
- log('Result ' + a * b);
- }
- multiply(); // Result 1
- multiply(10); // Result 10
- multiply(3, NaN); // Result 3
- multiply(9, 5); // Result 45
- }(window.console.log));
就如eval的字面意思來說,惡魔,使用eval()函數(shù)會帶來安全隱患。eval()函數(shù)的作用是返回任意字符串,當(dāng)作js代碼來處理。
只在對象構(gòu)造器、方法和在設(shè)定的閉包中使用 this 關(guān)鍵字。this 的語義在此有些誤導(dǎo)。它時而指向全局對象(大多數(shù)時),時而指向調(diào)用者的定義域(在 eval 中),時而指向 DOM 樹中的某一節(jié)點(diǎn)(當(dāng)用事件處理綁定到 HTML 屬性上時),時而指向一個新創(chuàng)建的對象(在構(gòu)造器中),還時而指向其它的一些對象(如果函數(shù)被 call() 和 apply() 執(zhí)行和調(diào)用時)。
正因?yàn)樗侨绱巳菀椎乇桓沐e,請限制它的使用場景:
函數(shù)式編程讓你可以簡化代碼并縮減維護(hù)成本,因?yàn)樗菀讖?fù)用,又適當(dāng)?shù)亟怦詈透俚囊蕾嚒?/p>
接下來的例子中,在一組數(shù)字求和的同一問題上,比較了兩種解決方案。第一個例子是經(jīng)典的程序處理,而第二個例子則是采用了函數(shù)式編程和 ECMA Script 5.1 的數(shù)組方法。不推薦
- (function(log){
- 'use strict';
- var arr = [10, 3, 7, 9, 100, 20],
- sum = 0,
- i;
- for(i = 0; i < arr.length; i++) {
- sum += arr[i];
- }
- log('The sum of array ' + arr + ' is: ' + sum)
- }(window.console.log));
推薦(函數(shù)式編程):
- (function(log){
- 'use strict';
- var arr = [10, 3, 7, 9, 100, 20];
- var sum = arr.reduce(function(prevValue, currentValue) {
- return prevValue + currentValue;
- }, 0);
- log('The sum of array ' + arr + ' is: ' + sum);
- }(window.console.log));
修改內(nèi)建的諸如 Object.prototype 和 Array.prototype 是被嚴(yán)厲禁止的。修改其它的內(nèi)建對象比如 Function.prototype,雖危害沒那么大,但始終還是會導(dǎo)致在開發(fā)過程中難以 debug 的問題,應(yīng)當(dāng)也要避免。
用三元操作符分配或返回語句。在比較簡單的情況下使用,避免在復(fù)雜的情況下使用。沒人愿意用 10 行三元操作符把自己的腦子繞暈。不推薦:
- if(x === 10) {
- return 'valid';
- } else {
- return 'invalid';
- }
推薦:
- return x === 10 ? 'valid' : 'invalid'
在js規(guī)范中,有很多規(guī)范都是樣式上的規(guī)范而不是邏輯上的規(guī)范,比如盡量使用===而不是==,我們可以使用JSHint或者JSLint,Javascript代碼驗(yàn)證工具,這種工具可以檢查你的代碼并提供相關(guān)的代碼改進(jìn)意見。我個人使用的是JSHint,所以就以這個為例
對于ws愛好者來說,我沒有用過其他的編譯器,ws基本上能滿足你的所有需求(最新的ws集成了vue)。在Settings => language & frameworks => JavaScript => Code Quality Tolls => JSHint
webstorm中的jshint
這些規(guī)范都是什么意思呢,這里列出一些常用的,剩下的大家可以參考官方文檔
ID和class的名稱總是使用可以反應(yīng)元素目的和用途的名稱,或其他通用的名稱,代替表象和晦澀難懂的名稱不推薦 :
- .fw-800 {
- font-weight: 800;
- }
- .red {
- color: red;
- }
推薦 :
- .heavy {
- font-weight: 800;
- }
- .important {
- color: red;
- }
一般情況下ID不應(yīng)該被用于樣式,并且ID的權(quán)重很高,所以不使用ID解決樣式的問題,而是使用class不推薦:
- #content .title {
- font-size: 2em;
- }
推薦:
- .content .title {
- font-size: 2em;
- }
從結(jié)構(gòu)、表現(xiàn)、行為分離的原則來看,應(yīng)該盡量避免css中出現(xiàn)HTML標(biāo)簽,并且在css選擇器中出現(xiàn)標(biāo)簽名會存在潛在的問題。
很多前端開發(fā)人員寫選擇器鏈的時候不使用 直接子選擇器(注:直接子選擇器和后代選擇器的區(qū)別)。有時,這可能會導(dǎo)致疼痛的設(shè)計(jì)問題并且有時候可能會很耗性能。然而,在任何情況下,這是一個非常不好的做法。如果你不寫很通用的,需要匹配到DOM末端的選擇器, 你應(yīng)該總是考慮直接子選擇器。不推薦:
- .content .title {
- font-size: 2rem;
- }
推薦
- .content > .title {
- font-size: 2rem;
- }
盡量使用縮寫屬性對于代碼效率和可讀性是很有用的,比如font屬性。不推薦:
- border-top-style: none;
- font-family: palatino, georgia, serif;
- font-size: 100%;
- line-height: 1.6;
- padding-bottom: 2em;
- padding-left: 1em;
- padding-right: 1em;
- padding-top: 0;
推薦:
- border-top: 0;
- font: 100%/1.6 palatino, georgia, serif;
- padding: 0 1em 2em;
省略0后面的
網(wǎng)站名稱:前端開發(fā)規(guī)范:命名規(guī)范、html規(guī)范、css規(guī)范、js規(guī)范
當(dāng)前鏈接:http://uogjgqi.cn/article/dhcssse.html

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流