JS模式 之通用模式(译)

字数 615阅读 483

原文 http://shichuan.github.io/javascript-patterns/

函数定义

创建匿名函数,并将其赋给一个变量。

不建议使用定义全局函数。这会污染全局变量。

条件

使用ifelse的模式以及反模式

获取全局对象

不直接用widows当做全局对象

直接用windows的风险在于,JS代码不只能在浏览器环境能执行。也有可能是在Nodejs之类的环境。

var模式

用一个var定义多个变量

例如

 var a = 1
, b = 2
, sum = a + b
, myobject = {}
, i
, j;

定义提升

函数内变量不管是在哪定义的,其实js在解析时,都会把变量定义放到函数的开始

为了避免变量重名,建议把在函数的变量的定义在函数的开始。

for循环

for循环优化

可优化的方面包括

  • 遍历数组时,在循环前算出要循环的次数(一般是数组长度)。(译者注:对于有JIT的JS引擎,这个这条可以忽略)
  • i+=1代替i++

for-in循环

for-in循环优化

for-in遍历对象属性时,用hasOwnProperty对非原型属性进行过滤。

拓展内建对象的原型

给内建对象(如Array,Object等)的原型上添加属性或方法时,不要覆盖内建对象的原型上属性或方法(即不能同名)

具体做法,例如

if (typeof Object.prototype.myMethod !== "function") {
Object.prototype.myMethod = function () {
// implementation...
};
}

switch模式

增加switch的可读性和健壮性

建议

  • 每个case对齐
  • 每个case后要加break;。特殊情况除外,但也要加注释说明
  • switch最后以default结尾

类型隐式转化

避免类型的隐式转化

两个变量用==比较时,类型会进行隐式转化。用===进行比较,就可以避免类型的隐式转化。

避免eval()

避免使用eval()

使用eval会增加代码的复杂性。同时也增加代码调试的难度。

parseInt进行数字转化

要用第二个参数指定进制

转化数字还可以用

  • +'08'
  • '08' - 0
  • Number('08')

但如果转化08 aaa,上面的几种方式都返回NaN。只有parseInt返回8。

最小化全局变量

在最外面的定义的方法和变量都是全局的

var myglobal = "hello"; 
console.log(myglobal); // "hello"
console.log(window.myglobal); // "hello"
console.log(window["myglobal"]); // "hello"
console.log(this.myglobal); // "hello"

避免方式是

(function(){
    var myglobal = "hello";
})()

全局的问题

全局的各种问题

推荐阅读更多精彩内容