JS编码规范
1 背景
JavaScript是一种通用的开发语言,这份指南列出了编写JavaScript时需要遵守的规则。
2 变量
声明变量必须加上var关键字,不能直接使用。
当你没有写var,变量就会暴露在全局上下文中,这样很可能会和现有变量冲突。
另外,如果没有加上,很难明确该变量的作用域是什么,变量也很可能像在局部作用域中,很轻易地泄漏到全局作用域当中去。
所以务必用 var 去声明变量。
3 常量
常量的形式如:NAMES_LIKE_THIS,即使用大写字符,并用下划线分隔。
4 分号
总是使用分号。
如果仅依靠语句间的隐式分隔,有时会很麻烦。你自己更能清楚哪里是语句的起止。
而且有些情况下, 漏掉分号会很危险。
JavaScript 的语句以分号作为结束符,除非可以非常准确推断某结束位置才会省略分号。在 JavaScript 中,只有当语句后的下一个符号是后缀或括号运算符时, 才会认为该语句的结束。
遗漏分号有时会出现很奇怪的结果,所以确保语句以分号结束。
5 嵌套函数
可以使用
嵌套函数很有用,比如,减少重复代码,隐藏帮助函数等。没什么其他需要注意的地方,随意使用。
6 块内函数声明
不要在块内声明一个函数
不要写成:
if (x) {
function foo() {}
}
虽然很多 JS 引擎都支持块内声明函数,但它不属于 ECMAScript 规范。
各个浏览器糟糕的实现相互不兼容,有些也与未来 ECMAScript 草案相违背.。ECMAScript 只允许在脚本的根语句或函数中声明函数。
如果确实需要在块中定义函数, 建议使用函数表达式来初始化变量。
if (x) {
var foo = function() {}
}
7 异常
可以
你在写一个比较复杂的应用时,不可能完全避免不会发生任何异常。大胆去用吧。
8 自定义异常
可以
有时发生异常了,但返回的错误信息比较奇怪,也不易读。虽然可以将含错误信息的引用对象或者可能产生错误的完整对象传递过来,但这样做都不是很好,最好还是自定义异常类,其实这些基本上都是最原始的异常处理技巧。
所以在适当的时候使用自定义异常。
9 标准特性
总是优于非标准特性。
最大化可移植性和兼容性,尽量使用标准方法而不是用非标准方法,比如
优先用string.charAt(3) 而不用 string[3],通过 DOM 原生函数访问元素,而不是使用应用封装好的快速接口。
10 封装基本类型
不要
没有任何理由去封装基本类型,另外还存在一些风险:
var x = new Boolean(false);
if (x) {
alert('hi'); // Shows 'hi'.
}
除非明确用于类型转换,其他情况请千万不要这样做!
var x = Boolean(0);
if (x) {
alert('hi'); // This will never be alerted.
}
typeof Boolean(0) == 'boolean';
typeof new Boolean(0) == 'object';
有时用作 number,string 或 boolean时,类型的转换会非常实用。
11 多级原型结构
不是首选
多级原型结构是指 JavaScript 中的继承关系。当你自定义一个D类,且把B类作为其原型,那么这就获得了一个多级原型结构,这些原型结构会变得越来越复杂!
12 方法定义
Foo.prototype.bar = function() { ... };
有很多方法可以给构造器添加方法或成员, 我们更倾向于使用如下的形式:
Foo.prototype.bar = function() {
/* ... */
};
13 闭包
可以,但小心使用。
闭包也许是 JS 中最有用的特性了。
14 eval()
eval() 会让程序执行的比较混乱, 当 eval() 里面包含用户输入的话就更加危险。
可以用其他更佳的,更清晰,更安全的方式写你的代码,所以一般情况下请不要使用 eval()。
15 with() {}
不要使用
使用 with 让你的代码在语义上变得不清晰。因为 with 的对象,可能会与局部变量产生冲突,从而改变你程序原本的用义。
下面的代码是干嘛的?
with (foo) {
var x = 3;
return x;
}
答案:任何事。局部变量 x 可能被 foo 的属性覆盖,当它定义一个 setter 时, 在赋值 3 后会执行很多其他代码。
所以不要使用 with 语句。
16 this
仅在对象构造器,方法,闭包中使用。
this 的语义很特别。有时它引用一个全局对象(大多数情况下),调用者的作用域(使用eval时),DOM 树中的节点(添加事件处理函数时),新创建的对象(使用一个构造器),或者其他对象(如果函数被call() 或 apply())。
使用时很容易出错,所以只有在下面两个情况时才能使用:
∙在构造器中
∙对象的方法(包括创建的闭包)中
17 for-in 循环
只用于 object/map/hash 的遍历
对 Array 用 for-in 循环有时会出错。因为它并不是从 0 到length - 1 进行遍历,而是所有出现在对象及其原型链的键值。
18 关联数组
永远不要使用 Array 作为 map/hash/associative 数组。
数组中不允许使用非整型作为索引值,所以也就不允许用关联数组。而取代它使用 Object 来表示 map/hash 对象。js原型和原型链的理解
Array 仅仅是扩展自 Object (类似于其他 JS 中的对象, 就像Date, RegExp 和 String)一样来使用。
19 多行字符串
不要使用
不要这样写长字符串:
var myStr = 'A rather long string of English text, an error message \
actually that just keeps going and going -- an error \
message to make the Energizer bunny blush (right through \
those Schwarzenegger shades)! Where was I? Oh yes, \
you\'ve got an error and all the extraneous whitespace is \
just gravy. Have a nice day.';
在编译时, 不能忽略行起始位置的空白字符; “\” 后的空白字符会产生奇怪的错误; 虽然大多数脚本引擎支持这种写法, 但它不是 ECMAScript 的标准规范。
20 Array 和 Object 直接量
使用 Array 和 Object 语法,而不使用Array 和 Object 构造器。
使用 Array 构造器很容易因为传参不恰当导致错误。
// Length is 3.
var a1 = new Array(x1, x2, x3);
// Length is 2.
var a2 = new Array(x1, x2);
// If x1 is a number and it is a natural number the length will be x1.
// If x1 is a number but not a natural number this will throw an exception.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论