编写可维护的javascript

 一、注释:

多行注释格式:最好接近java风格

/*
 * 这是一段注释
 * 这段注释包含两行,星号对齐,星号后有一个空格为佳
 */

多行注释之前应当有一个空行,且缩进层级和其他描述的代码保持一致。

二、语句表达式

1、所有的块语句都应该使用花括号:

if; for ; while ;  do...while... ; try....catch....finally ; 

推荐在括号两边各加一个空格,例如:

if ( condition ){
    doSomething();
}
  • switch语句

倾向于在没有默认行为且写了注释的情况下省略default,例如:

switch(condition){
    case "first":
         //代码
         break;
    case "second":
         //代码
         break;
    //没有 default
}
  • for循环

break可以直接跳出所有循环;

continue可以跳出本次循环,直接进行下一循环,但是不推荐使用continue ,当使用continue时,JSLint会给出警告,JSHint不会给出警告。

  • for-in 循环

用来遍历对象属性,返回属性名,而不是值 ,例如

var prop;

for ( prop in object) {
    console.log("Property name is "+ prop );
    console.log("Property value is "+ object[prop]);
}

不包含原型的遍历,推荐

var prop;

for ( prop in object) {
    if (object.hasOwnProperty(prop)) {
        console.log("Property name is "+ prop );
        console.log("Property value is "+ object[prop]);
   }
}

三、变量、函数和运算符

1、变量声明:提前至函数顶部

2、函数调用间隔:在函数名和左括号之间没有空格

好的写法: doSomething(item);  不好的写法: doSomething (item);

jQuery风格:在左括号之后,和右括号之前都加上空格

doSomething( item );

3、立即调用的函数

声明匿名函数,并将其赋值给变量或属性

Crockford编程规范推荐这样用:

//好的写法
var value = (function(){

    //函数体
    
    return {
        message: "Hi"
    }
});

4、相等

  • 强制类型转换: == ;!=

             会将非数值类型的变量先转为数值类型,再和数值类型比较。

  • 非强制类型转换 === !==

           不仅比较值大小是否相同,且比较数据类型是否相同。

  • eval()的参数是一个字符串,会将传入的参数当做一段js代码来执行
  •  禁止使用原始包装类型,当使用String,Number,或Boolean来创建对象时,JSLint 和JSHint都会给出警告。

四、UI层的松耦合

HTML在下层,CSS和JAVASCRIPT在上层

将CSS从JavaScript中抽离出来,原则上所有的样式信息都应该保持在CSS中,当需要通过JS来修改元素样式的时候,最佳方法是CSS的className,比如:在页面中显示一个对话框,在CSS中的样式定义是像下面这样:

.reveal {
    color: red;
    left: 10px;
    top: 100px;
    visibility: visible;
}

然后,在JS中像这样将样式添加至元素。

//好的写法 -- 原生写法
element.className += " reveal";

//好的写法 -- HTML5
element.classList.add("reveal");

//好的写法 -- YUI
Y.one(element).addClass("reveal");

//好的写法 -- Dojo
dojo.addClass(element, "reveal");

任何时刻,CSS中的样式是可以修改的,而不用更新JavaScript,JS不应该直接操作样式,以便保持和CSS的松耦合。

  • 将JS从HTML中抽离出来

不好的写法:<button οnclick="doSomething()" id="action-btn"> Click Me  </button>

function doSomething() {
     //代码
}

var btn = document.getElementById("action-btn");
addListener(btn, "click", doSomething);

使用JQuery的情况下:

$("#action-btn").on("click", doSomething);
  • 将HTML从JS中抽离出来

将HTML嵌入到JS中是非常不好的实践,增加了跟踪文本和结构性问题的复杂性。

解决办法:1.从服务器加载;

五、避免使用全局变量

推荐:单全局变量方式,创建自己的命名空间,或采用模块的方式。

六、时间处理

规则:隔离应用逻辑;不要分发事件对象;

 var MyApplication = {
        
        handleClick: funtion(even){
            
            //假设事件支持 DOM Level2
            event.preventDefault();
            event.stopPropagation();
            
            //传入应用逻辑
            this.showPopup(event.clientX, event.clientY);
        
        },
        showPopup: function(x, y){
            var popup = document,getElementById("popup");
            popup.style.left = x + "px";
            popup.style.top = y + "px";
            popup.className = "reveal";
            
         }
    };
    
    addEventListener(element, "click",function(event){
        MyApplication.handleClick(event);
    };

 MyApplication.handleClick(event);将X,Y坐标传入MyApplication.showPopup(),代替了之前传入的事件对象,可以清晰的看到MyApplication.showPopup(),所希望传入的参数,并且在测试或代码的任意位置都可以轻易地直接调用这段逻辑。例如

MyApplication.showPopup(10, 10);

 MyApplication.handleClick();是事件处理程序,因此它在将数据传入应用逻辑之前调用了event.preventDefault()和 event.stopPropagation(),这清楚地展示了事件处理程序和应用逻辑之间的分工。因为应用逻辑不需要对event产生依赖,进而在很多地方否可以轻松的使用相同的业务逻辑,包括写测试代码。

八、避免空比较

1、检测原始值  五种原始类型:字符串、数字、布尔值、null、undefined。

 //检测字符串
     if (typeOf name === "String") {
         anotherName = name.substr(3);
         
     }
     
     //检测数字
    if (typeof count === "number") {
         updateCount(count);
    }
    
    //检测布尔值
    if (typeof  found === "boolean" && found) {
         message("Found!");
    }
    
    //检测 undefined
    if (typeof MyApp === "undefined") {
         MyApp = {
             //其他的代码
         }
         
    }

2、检测引用值

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编写维护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工具集

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值