编写可维护的JavaScript

  • 缩进:两个制表符进行缩进/4个空格的缩进

  • 语句结尾:推荐总是使用分号

  • 行的长度:一行代码最长不应当超过80个字符

  • 换行:通常我们会在运算符后换行,下一行会增加两个层级的缩进,比如

// 好的做法:在运算符后换行,第二行追加两个缩进 
callAFunction(document, element, window, "some string value", true, 123, 
		navigator); 

// 不好的做法:第二行只有一个缩进 
callAFunction(document, element, window, "some string value", true, 123, 
	navigator); 

// 不好的做法:在运算符之前换行了 ,应该在逗号后换行
callAFunction(document, element, window, "some string value", true, 123 
		, navigator);
  • 注意:当给变量赋值时,第二行的位置应当和赋值运算符的位置保持对齐,例如:
var result = something + anotherThing + yetAnotherThing + somethingElse + 
			anotherSomethingElse;
			
// 这段代码里,变量anotherSomethingElse和首行的something保持左 对齐,确保代码的可读性,并能一眼看清楚折行文本的上下文。
  • 空行:在以下场景中添加空行也是不错的主意

    ​ 1、在方法之间;

    ​ 2、在方法中的局部变量和第一条语句之间;

    ​ 3、在多行或单行注释之前;

    ​ 4、在方法内的逻辑片段之间插入空行,提高可读性

  • 命名:驼峰式大小写,命法是由小写字母开始的,后续每个单词首字母都大写

  • 变量和函数:变量名应当总是遵守驼峰大小写命名法,并且命名前缀应当是名词;函数和方法命名来说,第一个单词应该是动词,这样有一些使用动词常见的约定:

动词含义
can函数返回一个布尔值
has函数返回一个布尔值
is函数返回一个布尔值
get函数返回一个非布尔值
set函数用来保存一个值
  • 常量:它使用大写字母和下划线来命名,下划线用以分隔单词,比如:MAX_COUNT

  • 构造函数:遵循大驼峰命名法,以大写字母开始,比如:function Person(name){}

  • 字符串:用双引号或单引号括起来

  • 注释:单行注释和多行注释

    ​ 单行注释:以两个斜线开始,以行尾结束,// 这是一句单行注释很多人喜欢在双斜线后敲入一个空格

    ​ 多行注释:它以/*开始,以*/结束

多行注释之前应当有一个空行,且缩进层级和其描述的代码保持一
/*
 * 另一段注释 
 * 这段注释包含两行文本 
 */
  • 语句和表达式:不论块语句包含多行代码还是单行代码,都应当总是使用花括号。

  • 左花括号建议是放在块语句中第一句代码的末尾

if (condition) { 
	doSomething(); 
} else { 
	doSomethingElse(); 
}
  • 在括左圆括号之前和右圆括号之后各添加一个空格
if (condition) { 
	doSomething(); 
}
  • JavaScript中允许多次使用var语句,推荐合并var语句,比如:
var value = 10,
	result = value + 10,
	i,
	len;
  • 先声明JavaScript函数然后使用函数,在函数名和左括号之间没有空格,这样做是为了将它和块语句区分开来。
// 好的写法 
doSomething(item); 

// 不好的写法:看起来像一个块语句 
doSomething (item);
  • 为了让立即执行函数能够被一眼看出来,可以将函数用一对圆括号包裹起来,比如:
// 好的写法 
var value = (function() { 
	// 函数体 
	return { 
		message: "Hi" 
	} 
}());
  • 最好不要在全局作用域中使用“use strict”,因为这会让文件中的所有代码都以严格模式下来解析,如果你希望在多个文件中应用严格模式而不必写很多行“user strict”,可以使用立即执行的函数;
(function(){
	"use strict";
	function doSomething(){
	
	}
	function doSomethingElse(){
	
	}
})();
  • 不推荐使用 == 和 != 而是应该使用 === 和 !==;

  • 避免使用原始包装类型,这会使开发者的思路常常会在对象和原始值之间跳来跳去,这样会增加出bug的概率,从而使开发者陷入困惑;

  • UI层的松耦合:HTML、CSS、JS三个彼此隔离又相互作用的层定义

    如果两个组件耦合太紧,则说明一个组件和另一个组件直接相关,这样的话,如果修改一个组件的逻辑,那么另外一个组件的逻辑也需修改。

  • 最好将所有的Javascript代码都放入外置文件中,以确保在HTML代码中不会有内联的JavaScript代码。

  • 将HTML从Javascript中抽离

// 不好的写法 
var div = document.getElementById("my-div"); div.innerHTML = "<h3>Error</h3><p>Invalid e-mail address.</p>";

【解决方法】:
1、将模板放置于远程服务器,使用XMLHttpRequest对象来获取外部标签;
2、简单客户端模板;
  • 避免使用全局变量

    全局变量带来的问题:

    ​ 1、命名冲突的概率比较高,即很可能无意间就使用了一个已经声明了的变量;

    ​ 2、代码的脆弱性;

    ​ 3、难以测试;

  • 推荐 typeof 无括号的写法 : typeof name,杜绝使用typeof来检测null的类型

  • 如果你只想检查实例对象的某个属性是否存在,则使用hasOwnProperty() 方法

  • 配置数据最好放在单独的文件中;

  • try-catch语句中,还可以增加一个finally块,不管代码是否有错误发生,最后都会被执行。如果try块中包含一个return语句,实际上它必须等到finally块中的代码执行后才能返回。

  • 千万不要将try-catch中的catch块留空,应该总是写点什么来处理错误。

  • 不是你的对象不要动,不要动原生对象,DOM对象,浏览器对象模型对象,类库的对象

  • 文件和目录结构

    ​ 1、一个文件只包含一个对象;

    ​ 2、相关联的对象,就把这些文件都放在同一个目录下;

    ​ 3、保持第三方代码的独立;

    ​ 4、build 用来放置最终构建后的文件;

    ​ 5、src 用来放置所有的源文件;

    ​ 6、test或tests 用来放置所有的测试文件;

参考资料:《编写可维护的JavaScript》书籍

编写维护JavaScript》向开发人员阐述了如何在团队开发编写具备高可维护性JavaScript代码,书中详细说明了作为团队一分子,应该怎么写JavaScript。本书内容涵盖了编码风格、编程技巧、自动化、测试等几方面,既包括具体风格和原则的介绍,也包括示例和技巧说明,最后还介绍了如何通过自动化的工具和方法来实现一致的编程风格。   《编写维护JavaScript》作者Nicholas C. Zakas是顶级的Web技术专家,也是《JavaScript高级程序设计》一书的作者。他曾是Yahoo!的首席前端开发工程师,在完成了从一名“独行侠”到“团队精英”的蜕变后,他站在前端工程师的角度提炼出众多的最佳编程实践,其中包括很多业内权威所推崇的最佳法则,而这些宝贵经验正是本书的核心内容。   《编写维护JavaScript》适合前端开发工程师、JavaScript程序员和学习JavaScript编程的读者阅读,也适合开发团队负责人、项目负责人阅读。运用本书中讲述的技巧和技术,可以使JavaScript团队编程从侠义的个人偏好的阴霾走出来,走向真正的高可维护性、高效能和高水准。 第一部分 编程风格 第1章 基本的格式化 1.1 缩进层级 1.2 语句结尾 1.3 行的长度 1.4 换行 1.5 空行 1.6 命名 1.6.1 变量和函数 1.6.2 常量 1.6.3 构造函数 1.7 直接量 1.7.1 字符串 1.7.2 数字 1.7.3 null 1.7.4 undefined 1.7.5 对象直接量 1.7.6 数组直接量 第2章 注释 2.1 单行注释 2.2 多行注释 2.3 使用注释 2.3.1 难于理解的代码 2.3.2 可能被误认为错误的代码 2.3.3 浏览器特性hack 2.4 文档注释 第3章 语句和表达式 3.1 花括号的对齐方式 3.2 块语句间隔 3.3 switch语句 3.3.1 缩进 3.3.2 case语句的“连续执行” 3.3.3 default 3.4 with语句 3.5 for循环 3.6 for-in循环 第4章 变量、函数和运算符 4.1 变量声明 4.2 函数声明 4.3 函数调用间隔 4.4 立即调用的函数 4.5 严格模式 4.6 相等 4.6.1 eval() 4.6.2 原始包装类型 第二部分 编程实践 第5章 UI层的松耦合 5.1 什么是松耦合 5.2 将JavaScript从CSS中抽离 5.3 将CSS从JavaScript中抽离 5.4 将JavaScript从HTML中抽离 5.5 将HTML从JavaScript中抽离 5.5.1 方法1:从服务器加载 5.5.2 方法2:简单客户端模板 5.5.3 方法3:复杂客户端模板 第6章 避免使用全局变量 6.1 全局变量带来的问题 6.1.1 命名冲突 6.1.2 代码的脆弱性 6.1.3 难以测试 6.2 意外的全局变量 避免意外的全局变量 6.3 单全局变量方式 6.3.1 命名空间 6.3.2 模块 6.4 零全局变量 第7章 事件处理 7.1 典型用法 7.2 规则1:隔离应用逻辑 7.3 规则2:不要分发事件对象 第8章 避免“空比较” 8.1 检测原始值 8.2 检测引用值 8.2.1 检测函数 8.2.2 检测数组 8.3 检测属性 第9章 将配置数据从代码中分离出来 9.1 什么是配置数据 9.2 抽离配置数据 9.3 保存配置数据 第10章 抛出自定义错误 10.1 错误的本质 10.2 在JavaScript中抛出错误 10.3 抛出错误的好处 10.4 何时抛出错误 10.5 try-catch语句 10.6 错误类型 第11章 不是你的对象不要动 11.1 什么是你的 11.2 原则 11.2.1 不覆盖方法 11.2.2 不新增方法 11.2.3 不删除方法 11.3 更好的途径 11.3.1 基于对象的继承 11.3.2 基于类型的继承 11.3.3 门面模式 11.4 关于Polyfill的注解 11.5 阻止修改 第12章 浏览器嗅探 12.1 User-Agent检测 12.2 特性检测 12.3 避免特性推断 12.4 避免浏览器推断 12.5 应当如何取舍 第三部分 自动化 第13章 文件和目录结构 13.1 最佳实践 13.2 基本结构 第14章 Ant 14.1 安装 14.2 配置文件 14.3 执行构建 14.4 目标操作的依赖 14.5 属性 14.6 Buildr项目 第15章 校验 15.1 查找文件 15.2 任务 15.3 增强的目标操作 15.4 其他方面的改进 15.5 Buildr任务 第16章 文件合并和加工 16.1 任务 16.2 行尾结束符 16.3 文件头和文件尾 16.4 加工文件 第17章 文件精简和压缩 17.1 文件精简 17.1.1 使用YUI Compressor精简代码 17.1.2 用Closure Compiler精简 17.1.3 使用UglifyJS精简 17.2 压缩 17.2.1 运行时压缩 17.2.2 构建时压缩 第18章 文档化 18.1 JSDoc Toolkit 18.2 YUI Doc 第19章 自动化测试 19.1 YUI Test Selenium引擎 19.1.1 配置一台Selenium服务器 19.1.2 配置YUI Test Selenium引擎 19.1.3 使用YUI Test Selenium引擎 19.1.4 Ant的配置写法 19.2 Yeti 19.3 PhantomJS 19.3.1 安装及使用 19.3.2 Ant的配置写法 19.4 JsTestDriver 19.4.1 安装及使用 19.4.2 Ant的配置写法 第20章 组装到一起 20.1 被忽略的细节 20.2 编制打包计划 20.2.1 开发版本的构建 20.2.2 集成版本的构建 20.2.3 发布版本的构建 20.3 使用CI系统 20.3.1 Jenkins 20.3.2 其他CI系统 附录A JavaScript编码风格指南 附录B JavaScript工具集
编写维护JavaScript》向开发人员阐述了如何在团队开发编写具备高可维护性JavaScript代码,书中详细说明了作为团队一分子,应该怎么写JavaScript。本书内容涵盖了编码风格、编程技巧、自动化、测试等几方面,既包括具体风格和原则的介绍,也包括示例和技巧说明,最后还介绍了如何通过自动化的工具和方法来实现一致的编程风格。   《编写维护JavaScript》作者Nicholas C. Zakas是顶级的Web技术专家,也是《JavaScript高级程序设计》一书的作者。他曾是Yahoo!的首席前端开发工程师,在完成了从一名“独行侠”到“团队精英”的蜕变后,他站在前端工程师的角度提炼出众多的最佳编程实践,其中包括很多业内权威所推崇的最佳法则,而这些宝贵经验正是本书的核心内容。   《编写维护JavaScript》适合前端开发工程师、JavaScript程序员和学习JavaScript编程的读者阅读,也适合开发团队负责人、项目负责人阅读。运用本书中讲述的技巧和技术,可以使JavaScript团队编程从侠义的个人偏好的阴霾走出来,走向真正的高可维护性、高效能和高水准。 第一部分 编程风格 第1章 基本的格式化 1.1 缩进层级 1.2 语句结尾 1.3 行的长度 1.4 换行 1.5 空行 1.6 命名 1.6.1 变量和函数 1.6.2 常量 1.6.3 构造函数 1.7 直接量 1.7.1 字符串 1.7.2 数字 1.7.3 null 1.7.4 undefined 1.7.5 对象直接量 1.7.6 数组直接量 第2章 注释 2.1 单行注释 2.2 多行注释 2.3 使用注释 2.3.1 难于理解的代码 2.3.2 可能被误认为错误的代码 2.3.3 浏览器特性hack 2.4 文档注释 第3章 语句和表达式 3.1 花括号的对齐方式 3.2 块语句间隔 3.3 switch语句 3.3.1 缩进 3.3.2 case语句的“连续执行” 3.3.3 default 3.4 with语句 3.5 for循环 3.6 for-in循环 第4章 变量、函数和运算符 4.1 变量声明 4.2 函数声明 4.3 函数调用间隔 4.4 立即调用的函数 4.5 严格模式 4.6 相等 4.6.1 eval() 4.6.2 原始包装类型 第二部分 编程实践 第5章 UI层的松耦合 5.1 什么是松耦合 5.2 将JavaScript从CSS中抽离 5.3 将CSS从JavaScript中抽离 5.4 将JavaScript从HTML中抽离 5.5 将HTML从JavaScript中抽离 5.5.1 方法1:从服务器加载 5.5.2 方法2:简单客户端模板 5.5.3 方法3:复杂客户端模板 第6章 避免使用全局变量 6.1 全局变量带来的问题 6.1.1 命名冲突 6.1.2 代码的脆弱性 6.1.3 难以测试 6.2 意外的全局变量 避免意外的全局变量 6.3 单全局变量方式 6.3.1 命名空间 6.3.2 模块 6.4 零全局变量 第7章 事件处理 7.1 典型用法 7.2 规则1:隔离应用逻辑 7.3 规则2:不要分发事件对象 第8章 避免“空比较” 8.1 检测原始值 8.2 检测引用值 8.2.1 检测函数 8.2.2 检测数组 8.3 检测属性 第9章 将配置数据从代码中分离出来 9.1 什么是配置数据 9.2 抽离配置数据 9.3 保存配置数据 第10章 抛出自定义错误 10.1 错误的本质 10.2 在JavaScript中抛出错误 10.3 抛出错误的好处 10.4 何时抛出错误 10.5 try-catch语句 10.6 错误类型 第11章 不是你的对象不要动 11.1 什么是你的 11.2 原则 11.2.1 不覆盖方法 11.2.2 不新增方法 11.2.3 不删除方法 11.3 更好的途径 11.3.1 基于对象的继承 11.3.2 基于类型的继承 11.3.3 门面模式 11.4 关于Polyfill的注解 11.5 阻止修改 第12章 浏览器嗅探 12.1 User-Agent检测 12.2 特性检测 12.3 避免特性推断 12.4 避免浏览器推断 12.5 应当如何取舍 第三部分 自动化 第13章 文件和目录结构 13.1 最佳实践 13.2 基本结构 第14章 Ant 14.1 安装 14.2 配置文件 14.3 执行构建 14.4 目标操作的依赖 14.5 属性 14.6 Buildr项目 第15章 校验 15.1 查找文件 15.2 任务 15.3 增强的目标操作 15.4 其他方面的改进 15.5 Buildr任务 第16章 文件合并和加工 16.1 任务 16.2 行尾结束符 16.3 文件头和文件尾 16.4 加工文件 第17章 文件精简和压缩 17.1 文件精简 17.1.1 使用YUI Compressor精简代码 17.1.2 用Closure Compiler精简 17.1.3 使用UglifyJS精简 17.2 压缩 17.2.1 运行时压缩 17.2.2 构建时压缩 第18章 文档化 18.1 JSDoc Toolkit 18.2 YUI Doc 第19章 自动化测试 19.1 YUI Test Selenium引擎 19.1.1 配置一台Selenium服务器 19.1.2 配置YUI Test Selenium引擎 19.1.3 使用YUI Test Selenium引擎 19.1.4 Ant的配置写法 19.2 Yeti 19.3 PhantomJS 19.3.1 安装及使用 19.3.2 Ant的配置写法 19.4 JsTestDriver 19.4.1 安装及使用 19.4.2 Ant的配置写法 第20章 组装到一起 20.1 被忽略的细节 20.2 编制打包计划 20.2.1 开发版本的构建 20.2.2 集成版本的构建 20.2.3 发布版本的构建 20.3 使用CI系统 20.3.1 Jenkins 20.3.2 其他CI系统 附录A JavaScript编码风格指南 附录B JavaScript工具集
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

*neverGiveUp*

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值