JS模式 之通用模式(译)

原文 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";
})()

全局的问题

全局的各种问题

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大闲人柴毛毛

Java基础深入解析——类与对象

成员变量与局部变量的区别 1.成员变量定义在类中,整个类中都能够访问。   局部变量定义在局部代码块中,只能在局部代码块中访问。 2.成员变量存在于堆内存中,有...

3357
来自专栏GreenLeaves

JS框架设计之对象扩展一种子模块

对象扩展 说完了,对象的创建(框架的命名空间的创建)以及如何解决多库之间的命名空间冲突问题之后,接下来,就是要扩展我们的对象,来对框架进行扩展,我们需要一种新功...

2369
来自专栏程序员互动联盟

【专业技术第十二讲】void的妙用

存在问题: 遇到微信好友询问关于void *的用法,这里做一个总结性的回复。 解决方案: void的字面意思是空类型,void *的意思是空类型指针,void ...

36910
来自专栏人工智能LeadAI

Python中defaultdict用法

defaultdict类的初始化函数接受一个类型作为参数,当所访问的键不存在的时候,可以实例化一个值作为默认值

1074
来自专栏java小白

LinkedHashMap的accessOrder

2069
来自专栏黑泽君的专栏

JDK5中Lock锁的使用

(1)JDK5中Lock锁的使用   虽然我们可以理解同步代码块和同步方法的锁对象问题,但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁,为了更清晰的...

1131
来自专栏C/C++基础

C++模板之隐式实例化、显示实例化、隐式调用、显示调用和模板特化详解

模板的实例化指函数模板(类模板)生成模板函数(模板类)的过程。对于函数模板而言,模板实例化之后,会生成一个真正的函数。而类模板经过实例化之后,只是完成了类的定义...

1882
来自专栏GreenLeaves

JavaScript之面向对象学习五(JS原生引用类型Array、Object、String等等)的原型对象介绍

1、原型模式的重要性不仅仅体现在创建自定义类型方面,就连所有的原生的引用类型(Obejct、Array、String等等)都在构造函数的原型上定义方法和属性。如...

21610
来自专栏决胜机器学习

《Redis设计与实现》读书笔记(五) ——Redis中的整数集合

《Redis设计与实现》读书笔记(五) ——Redis中的整数集合 (原创内容,转载请注明来源,谢谢) 一、概述 整数集合(intset)是redis数据结构集...

3524
来自专栏康怀帅的专栏

PHP 面向对象

面向对象三大特性:封装、继承、多态。 官方文档:http://php.net/manual/zh/language.oop5.php 要创建一个类的实例,必须使...

3807

扫码关注云+社区

领取腾讯云代金券