《编写可维护的JavaScript》——JavaScript编码规范(五)
语句和表达式
在JavaScript中,诸如if和for之类的语句有两种写法,使用花括号的多行代码或者不使用花括号的单行代码。比如:
//不好的写法,尽管这是合法的JavaScript代码
if (condition)
doSomething(); //不好的写法,尽管这是合法的JavaScript代码
if (condition) doSomething(); //不好的写法,尽管这是合法的JavaScript代码
if (condition) { doSomething(); } //好的写法
if (condition) {
doSomething();
}
前两种写法都没有花括号,这在很多编程规范中,都是被禁止的。
绝大多数JavaScript程序员认可这样一点:不论块语句包含多行代码还是单行代码,都应当总是使用花括号。因为省略花括号会造成一些困惑。
花括号的对齐方式
有两种主要的花括号对齐方式:
第一种风格是将花括号放置在块语句的第一句代码的末尾;
第二种对齐风格是将花括号放置于块语句首行的下一行。
Google JavaScript风格指南明确禁止第二种用法,以免导致错误的分号自动插入。个人更推荐第一种花括号对齐格式。
块语句间隔
块语句首行附近的空白行同样是我们需要考虑的。块语句间隔主要有三种主要的风格:
第一种风格是,在语句名、圆括号和左花括号之间没有空格间隔。
if(condition){
doSomething();
}
不少程序员喜欢这种风格,因为这种风格看起来很紧凑,而另一些人抱怨这种紧凑风格实际上破坏了一些易读性。Dojo编程风格指南推荐使用这种风格。
第二种风格是,在括左圆括号之前和右圆括号之后各添加一个空格。
if (condition) {
doSomething();
}
有很多程序员青睐这种风格,因为语句类型和条件判断更易读。这种风格是Crockford的编程规范和Google JavaScript风格指南所推荐的。
第三种风格是,在左圆括号后和右圆括号前各添加一个空格。
if ( condition ) {
doSomething();
}
jQuery核心风格指南文档规定了这种风格,因为它使语句中的各个部分都非常清晰和易读。
switch语句
关于switch语句的格式和使用方式也是众说纷纭。其中一些多样性来自于switch语句的传承,它源自C,但在Java和JavaScript中又没有完全相同的语法。
尽管语法相似,JavaScript中的switch语句的行为和在其他语言中是不一样的:switch语句中可以使用任意类型值,任何表达式都可合法地用于case从句。但在其他语言中则必须使用原始值和常量。
缩进
对于JavaScript程序员来说,switch语句的缩进格式是一个有争议的话题。很多人使用Java风格的switch语句,看起来像下面这样。
switch(condition) {
case "first":
//代码
break;
case "second":
//代码
break;
case "third":
//代码
break;
default:
//代码
}
这种格式的独特之处在于:
每条case语句相对于switch关键字都缩进一个层级。
从第二条case语句开始,每条case语句前后各有一个空行。
另一种格式如下:
switch(condition) {
case "first":
//代码
break;
case "second":
//代码
break;
case "third":
//代码
break;
default:
//代码
}
这个选择完全是个人偏好问题。
case语句的连续执行
“执行完一个case后连续执行(fall through)下一个case”,这是否是一种广为认可的实践,也是备受争议的一个问题。不小心省略case末尾的break是很多bug的罪魁祸首,因此Douglas Crockford 提出所有case都应当以break、return或throw做结尾,但没有给出任何解释。如果某个case执行结束后直接进入下一个case,JSLint会给出警告。
有很多人认为case的连续执行是一种可接受的编程方法,我很同意这种观点,只要程序逻辑非常清晰即可。但这种情况下最好给出注释。
default
switch语句中另一个需要讨论的议题是,是否需要default。很多人认为不论何时都不应该省略default,哪怕default什么也不做。
也有人更倾向于在没有默认行为且写了注释的情况下省略default。
with语句
在严格模式中,with语句是被明确禁止的,如果使用则报语法错误。强烈推荐避免使用with语句。
for循环
for循环有两种:一种是传统的for循环,是JavaScript从C和Java中继承而来;另一种是for-in循环,用来遍历对象的属性。这两种循环乍一看很类似,但却有着完全不同的用法。
传统的for循环往往用于遍历数组成员。
for-in循环是用来遍历对象属性的。不用定义任何控制条件,循环将会有条不紊地遍历每个对象属性,并返回属性名而不是值。
for-in循环有一个问题,就是它不仅遍历对象的实例属性(instance property),同样还遍历从原型继承来的属性。出于这个原因,最好使用hasOwnProperty()方法来为for-in循环过滤出实例属性。
var prop;
for (prop in object) {
if (object.hasOwnProperty(prop)) {
console.log("Property name is " + prop);
console.log("Property value is "+ object[prop]);
}
}
推荐在所有for-in循环中使用hasOwnProperty(),除非你想查找原型链,这时就应当补充注释。
关于for-in循环,还有一点需要注意,即for-in循环是用来遍历对象的。一个常见的错误用法就是使用for-in循环来遍历数组成员。
<!--
作者:纤锐
出处:http://www.cnblogs.com/beginner2014
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。谢谢合作。
-->
《编写可维护的JavaScript》——JavaScript编码规范(五)的更多相关文章
- 如何编写可维护的面向对象JavaScript代码
能够写出可维护的面向对象JavaScript代 码不仅可以节约金钱,还能让你很受欢迎.不信?有可能你自己或者其他什么人有一天会回来重用你的代码.如果能尽量让这个经历不那么痛苦,就可以节省不少时 间.地 ...
- [转]JavaScript程序编码规范
原文:http://javascript.crockford.com/code.html 作者:Douglas Crockford 译文:http://www.yeeyan.com/articles/ ...
- 转发一个javascript的编码规范
google出品:http://chajn.org/jsguide/javascriptguide.html
- 浅谈 JavaScript 编程语言的编码规范
对于熟悉 C/C++ 或 Java 语言的工程师来说,JavaScript 显得灵活,简单易懂,对代码的格式的要求也相对松散.很容易学习,并运用到自己的代码中.也正因为这样,JavaScript 的编 ...
- 【转发】网易邮箱前端技术分享之javascript编码规范
网易邮箱前端技术分享之javascript编码规范 发布日期:2013-11-26 10:06 来源:网易邮箱前端技术中心 作者:网易邮箱 点击:533 网易邮箱是国内最早使用ajax技术的邮箱.早在 ...
- 网易前端JavaScript编码规范
在多年开发邮箱webmail过程中,网易邮箱前端团队积累了不少心得体会,我们开发了很多基础js库,实现了大量前端效果组件,开发了成熟的opoa框架以及api组件,在此向大家做一些分享.今天想先和大家聊 ...
- 网易邮箱前端Javascript编码规范:基础规范
在多年开发邮箱webmail过程中,网易邮箱前端团队积累了不少心得体会,我们开发了很多基础js库,实现了大量前端效果组件,开发了成熟的opoa框架以及api组件,在此向大家做一些分享.今天想先和大家聊 ...
- Java 编码规范有感
应小组要求,开发测试都需要考阿里编码规范,因此,相当于是突击了一下关于编码规范方面的知识,目前做的项目后期需要进行项目迁移,数据迁移,功能迁移... 各种迁移... 阿里巴巴编码规范(Java)考试地 ...
- 《编写可维护的JavaScript》——JavaScript编码规范(一)
缩进层级 代码如何缩进通常有两种主张: 使用制表符缩进 每一个缩进层级都用单独的制表符表示.这种方法的主要缺点是:系统对制表符的解释不一致.这些差异会导致不同的开发者对同一段代码有不同的看法的,这正是 ...
- 《编写可维护的 Javascript》读书笔记(附录 A 部分):Javascript 编码风格指南(1)原始值
记录一下比较有用的编码规范(该指南是基于 Java 语言编码规范和 Javascript 编程规范,同时结合作者 Nicholos Zakas 的个人经验和喜好). 一些关于格式(包括缩进.行的长度. ...
随机推荐
- /proc/sys/vm/参数
1) /proc/sys/vm/block_dump该文件表示是否打开Block Debug模式,用于记录所有的读写及Dirty Block写回动作.缺省设置:0,禁用Block Debug模式2) ...
- vert.x学习(六),动态模板与静态文件的结合
这篇学习在动态模板里面引入css,把动态模板与静态文件结合起来使用. 编写DynamicReference.java package com.javafm.vertx.helloworld; impo ...
- Spring IoC容器初始化过程学习
IoC容器是什么?IoC文英全称Inversion of Control,即控制反转,我么可以这么理解IoC容器: 把某些业务对象的的控制权交给一个平台或者框架来同一管理,这个同一管理的平台可以称为I ...
- MXNET安装过程中遇到libinfo导入不了的问题解决
今天尝试安装windows版本的MXNET,在按照官网的运行了python的setup之后,import mxnet时出现如下错误:cannot import name libinfo,在网上查找发现 ...
- java文件来演示如何访问MySQL数据库
java文件来演示如何访问MySQL数据库. 注:在命令行或用一个SQL的前端软件创建Database. 先创建数据库: CREATE DATABASE SCUTCS; 接着,创建表: CREATE ...
- asp.net 重定向的三种方法
1.Server.Transfer("URL"): 服务器停止解析本页,保存此页转向前的数据后,再使页面转向到newPage.aspx, 并将转向前数据加上newPage.aspx ...
- jquery的$().each,$.each的区别
在jquery中,遍历对象和数组,经常会用到$().each和$.each(),两个方法.两个方法是有区别的,从而这两个方法在针对不同的操作上,显示了各自的特点. $().each,对于这个方法,在d ...
- JMeter学习-035-JMeter调试工具之二---Debug PostProcessor
前文 JMeter学习-034-JMeter调试工具之一---HTTP Mirror Server讲述了HTTP镜像服务器在调试请求入参时的实例应用.此文我们讲述另一种测试脚本调试工具的使用. 前置处 ...
- Python 面向对象(初级篇)
51CTO同步发布地址:http://3060674.blog.51cto.com/3050674/1689163 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后 ...
- 搜索引擎Solr系列(一): Solr6.2.1环境搭建
一:Solr简介 Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口.用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引:也可以通 ...