在学习编程的时候,每次看到那些整齐规范的代码,内心顿时对这个程序员表示点点好感,有时,好比看到本身和朋友写的代码时,那阅读起来就是苦不堪言,因此,一些基本的开发规范是必须的,是为了本身方便阅读代码,也方便他人阅读修改代码。javascript
Pascal Case 大驼峰式命名法:首字母大写。eg:StudentInfo、UserInfo、ProductInfo
Camel Case 小驼峰式命名法:首字母小写。eg:studentInfo、userInfo、productInfocss
文件名不得含有空格
文件名建议只使用小写字母,不使用大写字母。( 为了醒目,某些说明文件的文件名,可使用大写字母,好比README、LICENSE。 )
文件名包含多个单词时,单词之间建议使用半角的连词线 ( - ) 分隔。
引入资源使用相对路径,不要指定资源所带的具体协议 ( http:,https: ) ,除非这二者协议都不可用。html
推荐:前端
<script src="//cdn.com/foundation.min.js"></script>
类型 小写字母
array a
boolean b
function fn
int i
object o
regular r
string svue
动词 含义 返回值
can 判断是否可执行某个动做 ( 权限 ) 函数返回一个布尔值。true:可执行;false:不可执行
has 判断是否含有某个值 函数返回一个布尔值。true:含有此值;false:不含有此值
is 判断是否为某个值 函数返回一个布尔值。true:为某个值;false:不为某个值
get 获取某个值 函数返回一个非布尔值
set 设置某个值 无返回值、返回是否设置成功或者返回链式对象java
推荐:程序员
//是否可阅读 function canRead(){ return true; } //获取姓名 function getName{ return this.name }
推荐:web
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私有变量的值
注释代码://(双斜线)与代码之间保留一个空格。数组
推荐:
// 调用了一个函数;1)单独在一行 setTitle(); var maxCount = 10; // 设置最大量;2)在代码后面注释 // setName(); // 3)注释代码
推荐:
/*
* 代码执行到这里后会调用setTitle()函数 * setTitle():设置title的值 */ setTitle();
函数(方法)注释也是多行注释的一种,可是包含了特殊的注释要求,参照 javadoc(百度百科)
语法:
/** * 函数说明 * @关键字 */
经常使用注释关键字
注释名 语法 含义 示例
@param @param 参数名 {参数类型} 描述信息 描述参数的信息 @param name {String} 传入名称 @return @return {返回类型} 描述信息 描述返回值的信息 @return {Boolean} true:可执行;false:不可执行 @author @author 做者信息 [附属信息:如邮箱、日期] 描述此函数做者的信息 @author 张三 2015/07/21 @version @version XX.XX.XX 描述此函数的版本号 @version 1.0.3 @example @example 示例代码 @example setTitle('测试') 以下
推荐:
/** - 合并Grid的行 - @param grid {Ext.Grid.Panel} 须要合并的Grid - @param cols {Array} 须要合并列的Index(序号)数组;从0开始计数,序号也包含。 - @param isAllSome {Boolean} :是否2个tr的cols必须完成同样才能进行合并。true:完成同样;false(默认):不彻底同样 - @return void - @author polk6 2015/07/21 - @example - _________________ _________________ - | 年龄 | 姓名 | | 年龄 | 姓名 | - ----------------- mergeCells(grid,[0]) ----------------- - | 18 | 张三 | => | | 张三 | - ----------------- - 18 --------- - | 18 | 王五 | | | 王五 | - ----------------- ----------------- */ function mergeCells(grid, cols, isAllSome) { // Do Something }
HTML5的文档类型声明:<!DOCTYPE html>
推荐:
<html> <head> <link rel="stylesheet" href="main.css"> </head> <body> <!-- body goes here --> <script src="main.js" async></script> </body> </html>
只兼容现代浏览器推荐:
<html> <head> <link rel="stylesheet" href="main.css"> <script src="main.js" async></script> </head> <body> <!-- body goes here --> </body> </html>
语义化是指:根据元素其被创造出来时的初始意义来使用它。
意思就是用正确的标签干正确的事,而不是只有div和span。
推荐:
html 代码:
<!-- The page header should go into a header element --> <header> <!-- As this title belongs to the page structure it's a heading and h1 should be used --> <h1>My page title</h1> </header> <!-- All navigation should go into a nav element --> <nav class="top-navigation"> <!-- A listing of elements should always go to UL (OL for ordered listings) --> <ul> <li class="nav-item"><a href="#home">Home</a></li> <li class="nav-item"><a href="#news">News</a></li> <li class="nav-item"><a href="#about">About</a></li> </ul> </nav> <!-- The main part of the page should go into a main element (also use role="main" for accessibility) --> <main class="news-page" role="main"> <!-- A section of a page should go into a section element. Divide a page into sections with semantic elements. --> <section class="page-section news"> <!-- A section header should go into a section element --> <header> <!-- As a page section belongs to the page structure heading elements should be used (in this case h2) --> <h2 class="title">All news articles</h2> </header> <!-- If a section / module can be seen as an article (news article, blog entry, products teaser, any other re-usable module / section that can occur multiple times on a page) a article element should be used --> <article class="news-article"> <!-- An article can contain a header that contains the summary / introduction information of the article --> <header> <!-- As a article title does not belong to the overall page structure there should not be any heading tag! --> <div class="article-title">Good article</div> <!-- Small can optionally be used to reduce importance --> <small class="intro">Introduction sub-title</small> </header> <!-- For the main content in a section or article there is no semantic element --> <div class="content"> <p>This is a good example for HTML semantics</p> </div> <!-- For content that is represented as side note or less important information in a given context use aside --> <aside class="article-side-notes"> <p>I think I'm more on the side and should not receive the main credits</p> </aside> <!-- Articles can also contain footers. If you have footnotes for an article place them into a footer element --> <footer class="article-foot-notes"> <!-- The time element can be used to annotate a timestamp. Use the datetime attribute to specify ISO time while the actual text in the time element can also be more human readable / relative --> <p>This article was created by David <time datetime="2014-01-01 00:00" class="time">1 month ago</time></p> </footer> </article> <!-- In a section, footnotes or similar information can also go into a footer element --> <footer class="section-footer"> <p>Related sections: Events, Public holidays</p> </footer> </section> </main> <!-- Your page footer should go into a global footer element --> <footer class="page-footer"> Copyright 2014 </footer>
标签的 alt 属性指定了替代文本,用于在图像没法显示或者用户禁用图像显示时,代替图像显示在浏览器中的内容。
假设因为下列缘由用户没法查看图像,alt 属性能够为图像提供替代的信息:
尽可能在文档和模板中只包含结构性的 HTML;而将全部表现代码,移入样式表中;将全部动做行为,移入脚本之中。
在此以外,为使得它们之间的联系尽量的小,在文档和模板中也尽可能少地引入样式和脚本文件。
建议:
推荐:
html 代码:
<!-- That's clean markup! --> <span class="text-box"> See the square next to me? </span> 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 中的惟一理由是它们呈现出了与内容相关的一些信息。
推荐:
html 代码:
<!-- That's clean markup! --> <span class="text-box"> See the square next to me? </span> 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),建立独立隔绝的定义域。也使得内存在执行完后当即释放。
IIFE 还可确保你的代码不会轻易被其它全局命名空间里的代码所修改(i.e. 第三方库,window 引用,被覆盖的未定义的关键字等等)。
推荐:
// 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));
'use strict'; // Code goes here }());
若是你想引用全局变量或者是外层 IIFE 的变量,能够经过下列方式传参:
(function($, w, d){ 'use strict'; $(function() { w.alert(d.querySelectorAll('div').length); }); }(jQuery, window, document));
ECMAScript 5 严格模式可在整个脚本或独个方法内被激活。它对应不一样的 javascript 语境会作更加严格的错误检查。严格模式也确保了 javascript 代码更加的健壮,运行的也更加快速。
严格模式会阻止使用在将来极可能被引入的预留关键字。
你应该在你的脚本中启用严格模式,最好是在独立的 IIFE 中应用它。避免在你的脚本第一行使用它而致使你的全部脚本都启动了严格模式,这有可能会引起一些第三方类库的问题。
老是使用 var 来声明变量,而且使用单var模式(将全部的变量在函数最前面只使用一个var定义)。例如:
(function (){ 'use strict' var a = 0, b = 0, c = 0, i, j, myObject(); }())
javascript会自动将函数做用域内的变量和方法的定义提早(只是提早声明,赋值仍是在原处)
例如:
(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 的强制类型转换所形成的困扰。例如:
(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
总结:
==, >, <, +, -, … 这些操做符所形成的隐式类型转换都是无反作用的,它不会改变变量自己保存的值。,可是,若是你覆写某个对象的 valueOf/toString的话,==就会产生反作用.
例如:
Array.prototype.valueOf = function() { this[0]++; return this; } var x = [1, 2, 3]; x == 0; console.log(x); // [2, 2, 3]
===操做符:
js中如下内容为假:
逻辑操做符 || 和 && 也可被用来返回布尔值。若是操做对象为非布尔对象,那每一个表达式将会被自左向右地作真假判断。基于此操做,最终总有一个表达式被返回回来。这在变量赋值时,是能够用来简化你的代码的。例如:若是x不存在且y不存在,x=1;若是x存在y存在,x = y
如eval的字面意思来讲,恶魔,使用eval()函数会带来安全隐患。
eval()函数的做用是返回任意字符串,看成js代码来处理。
只在对象构造器、方法和在设定的闭包中使用 this 关键字。this 的语义在此有些误导。它时而指向全局对象(大多数时),时而指向调用者的定义域(在 eval 中),时而指向 DOM 树中的某一节点(当用事件处理绑定到 HTML 属性上时),时而指向一个新建立的对象(在构造器中),还时而指向其它的一些对象(若是函数被 call() 和 apply() 执行和调用时)。
正由于它是如此容易地被搞错,请限制它的使用场景:
函数式编程让你能够简化代码并缩减维护成本,由于它容易复用,又适当地解耦和更少的依赖。
接下来的例子中,在一组数字求和的同一问题上,比较了两种解决方案。第一个例子是经典的程序处理,而第二个例子则是采用了函数式编程和 ECMA Script 5.1 的数组方法。
不推荐:
(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));
推荐(函数式编程):
(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));
修改内建的诸如 Object.prototype 和 Array.prototype 是被严厉禁止的。修改其它的内建对象好比 Function.prototype,虽危害没那么大,但始终仍是会致使在开发过程当中难以 debug 的问题,应当也要避免。
用三元操做符分配或返回语句。在比较简单的状况下使用,避免在复杂的状况下使用。没人愿意用 10 行三元操做符把本身的脑子绕晕。
不推荐:
if(x === 10) { return 'valid'; } else { return 'invalid'; }
推荐:
return x === 10 ? 'valid' : 'invalid'
在js规范中,有不少规范都是样式上的规范而不是逻辑上的规范,好比尽可能使用===而不是==,咱们可使用JSHint或者JSLint,Javascript代码验证工具,这种工具能够检查你的代码并提供相关的代码改进意见。我我的使用的是JSHint,因此就以这个为例.
对于ws爱好者来讲,我没有用过其余的编译器,ws基本上能知足你的全部需求(最新的ws集成了vue)。
在Settings => language & frameworks => JavaScript => Code Quality Tolls => JSHint
其他规范参考官方文档:http://jshint.com/docs/
ID和class的名称老是使用能够反应元素目的和用途的名称,或其余通用的名称,代替表象和晦涩难懂的名称。
不推荐:
.fw-800 { font-weight: 800; } .red { color: red; }
推荐:
.heavy { font-weight: 800; } .important { color: red; }
通常状况下ID不该该被用于样式,而且ID的权重很高,因此不使用ID解决样式的问题,而是使用class
不推荐:
#content .title { font-size: 2em; }
推荐:
.content .title { font-size: 2em; }
从结构、表现、行为分离的原则来看,应该尽可能避免css中出现HTML标签,而且在css选择器中出现标签名会存在潜在的问题。
不少前端开发人员写选择器链的时候不使用 直接子选择器(注:直接子选择器和后代选择器的区别)。
有时,这可能会致使疼痛的设计问题而且有时候可能会很耗性能。
然而,在任何状况下,这是一个很是很差的作法。
若是你不写很通用的,须要匹配到DOM末端的选择器, 你应该老是考虑直接子选择器。
不推荐:
.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后面的单位,
推荐:
padding-bottom: 0; margin: 0;
做为实践,遵循如下顺序:
结构型属性:
表现型属性:
不推荐:
.box { font-family: 'Arial', sans-serif; border: 3px solid #ddd; left: 30%; position: absolute; text-transform: uppercase; background-color: #eee; right: 30%; isplay: block; font-size: 1.5rem; overflow: hidden; padding: 1em; margin: 1em; }
推荐:
.box { display: block; position: absolute; left: 30%; right: 30%; overflow: hidden; margin: 1em; padding: 1em; background-color: #eee; border: 3px solid #ddd; font-family: 'Arial', sans-serif; font-size: 1.5rem; text-transform: uppercase; }
原文地址: