初识JSLint及建议JS编码风格
可能都或多或少的知道JSLint是一个JavaScript的代码质量工具,一个JavaScript语法检查器和校验器,它能分析JavaScript问题并报告它包含的缺点。
被发现的问题往往是语法错误,但也不一定全是,JSLint查看一些代码风格惯例及结构上的问题。
下面我介绍一些JSLint的常识
未定义的变量和函数
JavaScript最大的问题是对全局变量的依赖,特别是隐式的全局变量。
JSLint期望所有的变量和函数在使用或调用前都已被声明。通过这种方式来判断是否为隐式的全局变量,那如果一个JS文件会依赖别处定义的全局变量或函数,你可以在此JS文件包含注释从而标识给JSLint知识,这个注释列出所有无需JSLint检测的全局变量。
/*global GetByNameFn,myObj,myFn*/
注意在g之前没有空白。
你可以使用任意多个/*global*/注释,但它们必须出现在指定的变量被使用之前。
成员元素
因为JavaScript是弱类型的动态对象语言,也就是说可以给对象随时添加任意多个不同类型的属性,这就导致我们无法在编译时确定对象的属性名是否拼写正确。JSLint用/*members*/来帮忙检测属性是否有拼写错误。可以使用/*members*/注释到你的脚本中,JSLint将会依照该列表来检查所有属性名字的拼写。
/*members doTell,mercySakes,myGoodness,ohGo*/
分号
JSLint期望在除了for,function,if,switch,try和while之外的每个语句后面都跟着分号,但是JSLint并不期望看到不必要的分号
换行
为了让代码看起来层次分明,大家都会不自觉的用空行来让代码分层,但是JSLint建议你总是在运算符之后换行,因为这样可避免很多不必要的错误。
逗号
大家都知道逗号在JavaScript中既可以用作分隔符也可是是运算符。
但是JSLint期望逗号被用作分隔符而不是运算符(除了在for语句 的初始化和增量两部分中以外),它不期望看到数组字面量中省略掉一些元素,多余的逗号不应该被使用,比如说不应该在数组字面量或对象字面量的最后一个元素之后出现逗号,因为这样会被一些浏览器错误的解析。
必要的代码块
JSLint不期望你省略掉代码块语句,也就是说建议你即使条件判断语句中,即使只有一条语句也应该用花括号包围起来。
变量在作用域最前端声明
大家都清楚在JavaScript中是没有块作用域的,只有函数作用域,而且变量有提升声明的特性,所以JSLint建议在作用域最前端声明,最好是使用单语句变量声明。
for in 语句
for in语句可以用来遍历对象的所有属性的名字,但是也会遍历出所有从原型链中继承而来的成员元素。所以最好用如下代码所示:
for (var name in object) {
if (object.hasOwnProperty(name)) {
}
}
Switch语句
虽然在JavaScript中在Switch是可以穿透case语句的,但JSLint期望在下一个case或default语句之前有如下语句中的一条:break、return、throw。
var语句
With
虽然在JavaScript中,with语句有时会提供方便,但JSLint不期望看到with语句。
=
JSLint不期望在if或while语句的条件部分看到赋值语句,如果你确实是想要是一个赋值那么把它用括号括起来吧,如下代码所示:
if ((a=b)) { }
==和!=
==和!=在执行比较前会做强制类型转换,JSLint推荐使用===和!==来替换==和!=。
如果你希望做强制类型转换,那么请使用简易格式。
(foo != 0)
(foo)//建议用此简易方式来实现(foo != 0)
(foo == 0)
(!foo)//建议用此简易方式来实现 (foo == 0)
标签
JavaScript允许任何语句都拥有一个标签,并且标签有一个单独的名称空间,但JSLint期望标签只会用在与break语句进行交互的下列语句中,如switch while do for等
不可达代码
JSLint期望return break continue或throw语句后面紧跟一个}
混乱的正负号
JSLint期望+不会跟在+或++的后面,同理-不会跟在-或--的后面,因为一个位置不当的空格将可能使+ +变成++,这样的错误很难被发现,如果非要连接一起使用请用圆括号来避免混淆。
++和--
JSLint建议尽量避免使用++和--,因为这样会出现糟糕难以理解的代码。
位运算符
在JavaScript中没有整数类型,但它有位运算符,位运算符把它们的运算数从浮点转换为整数后再进行运算,所以在JavaScript中的位运算符效率远没有其它语言的高
void
在大多数语言中,void是一种类型,而在JavaScript中,void是一个总是返回undefined的前置运算符,JSLint不期望看到void,因为它令人困惑而且没什么用。
构造器函数和new运算符位运算符
JSLint强制约定构造器函数必须以首字母大写的形式命名,JSLint不期望看到一个首字母大写的函数在没有new前缀的情况下被调用,JSLint也不期望看到与new 连用的函数名不是以大写字母开头。
JSLint不期望看到这些封装形式:new Number、new String 、new Boolean
JSLint不期望看到new Object(使用对象字面量{}代码)
JSLint不期望看到new Array(使用数组字面量[]代码)
JSLint选项
初识JSLint及建议JS编码风格的更多相关文章
- JavaScript编码风格指南(中文版)
前言: 程序语言的编码风格对于一个长期维护的软件非常重要,特别是在团队协作中.如果一个团队使用统一规范的编码分风格,可以提高团队的协作水平和工作效率.编程风格指南的核心是基本的格式化规则,这些规则决定 ...
- 【翻译】Ext JS——高效的编码风格指南
原文:ExtJS - Efficient coding style guide 作者:Raja 切勿使用"new"关键字:在Ext JS中,使用"new"关键字 ...
- 一步一步学Python(1) 基本逻辑控制举例和编码风格规范
(1) 基本逻辑控制举例和编码风格规范 1.while死循环 2.for循环 3.if,elif,else分支判断 4.编码风格(官方建议) 版本:Python3.4 1.while死循环 #func ...
- 一些达成共识的JavaScript编码风格约定
如果你的代码易于阅读,那么代码中bug也将会很少,因为一些bug可以很容被调试,并且,其他开发者参与你项目时的门槛也会比较低.因此,如果项目中有多人参与,采取一个有共识的编码风格约定非常有必要.与其他 ...
- HTML/CSS/JS编码规范
最近整理了一份HTML/CSS/JS编码规范,供大家参考.目录:一.HTML编码规范二.CSS编码规范三.JS编码规范 一.HTML编码规范 1. img标签要写alt属性 根据W3C标准,img标签 ...
- 一些达成共识的JavaScript编码风格约定【转】
如果你的代码易于阅读,那么代码中bug也将会很少,因为一些bug可以很容被调试,并且,其他开发者参与你项目时的门槛也会比较低.因此,如果项目中有多人参与,采取一个有共识的编码风格约定非常有必要.与其他 ...
- Nim编码风格
介绍 Nim语言不限制开发人员使用哪种具体的编码风格, 但为了社区的发展,在编写一些标准库的时候还是应该遵从统一的编码风格 这篇文章会列出一系列的编码风格准则,供大家参考. 但值得注意的是,有很多例外 ...
- Android编码风格
整理一下51CTO学院中张凌华老师讲的编码风格课程 一. 项目开发目录命名: Requirement - 需求相关文档 Design - 设计 Planning&Log - 计划,日志,会议 ...
- JS代码风格自动规整工具Prettier
问题背景 通常使用 ESLint做代码风格检查检查, 和部分代码质量检查. 但是使用ESLint在入库时候, 会产生很多的代码修正工作, 需要开发者一个一个的修改. 如果很多,并且时间紧迫,甚是尴尬. ...
随机推荐
- Kafka笔记
最近做的一个项目需要跟Kafka打交道,学习了很多相关知识,就到这里来汇总一下. kafka是一个传递消息的系统,原本是用来快速记录海量log的,现在也经常用作消息队列.它主要由三个部分组成,prod ...
- fdisk分区硬盘并shell脚本自动化
最近工作需要用到对硬盘进行shell脚本自动化分区和mount的操作,google了一些资料,下面做个总结. 如果硬盘没有进行分区(逻辑分区或者扩展分区,关于两者概念,自行google),我们将无法将 ...
- Xen虚拟化基本原理详解
标签:虚拟化 xen 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://wangzan18.blog.51cto.com/80210 ...
- MSSQL 问题集锦
[1]关于SQL Server数据库连接字符串的特殊参数说明 MultipleActiveResultSets和Mars_Connection同义,指定此数据库连接是否复用数据库内已建立的相同用户的连 ...
- 【JavaScript】 knockout.js 日期格式化借助【momentjs】
源:Knockout.js 日期格式化 源:momentjs
- inheritableStatics 与statics类
/** * statics 可以包含类的静态和静态方法,但是不能被子类继承 * inheritableStatics 与statics类似但是可以被子类继承 */ Ext.onReady(functi ...
- Android Toast效果设置
Android Toast效果设置 Toast是Android中用来显示显示信息的一种机制,和Dialog不一样的是,Toast是没有焦点的,而且Toast显示的时间有限,过一定的时间就会自动消失.总 ...
- 远程登录服务器执行cmd的Python脚本
import paramiko,os,sys ip = raw_input("input ip address :>>>") password = raw_inp ...
- java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'XXXXX' bean
今天启动srpingmvc项目的时候出现了这个异常, 原因: 在同个项目中,我复制了其中一个 Controller 作为备份 却忘记修改 @RequestMapping("/xxx&quo ...
- bzoj4400: tjoi2012 桥
先传代码再填坑 #include <iostream> #include <cstdio> #include <cmath> #include <cstrin ...