Javascript模式阅读笔记 · 基本技巧(二)

使用parseInt()的数值约定

通过使用parseInt(),可以从一个字符串中获取数值。该函数的第二个参数是一个进制参数,通常可以忽略该参数,但是最好不要这样做,因为当解析的字符串是0开始就会出现错误:例如在处理日期时,只有一部分日期会进入字段。在ECMAScript 3版本中,0开始的字符串就会被当作一个八进制数,而在ECMAScript 5版本中发生了改变。为了避免不一致性和未预期的结果,请每次都具体指定进制参数。

var month = "06", year = "09";
month = parseInt(month, 10);
year = parseInt(year, 10);

在本例中,如果忽略了进制参数,使用类似parseInt(year)的方法,那么返回值将是0,因为“09”会当作一个八进制数进行处理(和使用parseInt(year, 8)一样),而09在八进制中不是一个合法的数值。

另外一个将字符串转换为数值的方法是:

+ "08";  // 8
Number("08");  // 8

这种方法通常会比parseInt()快很多,因为正如其名称一样,parseInt()是解析而不是简单地转换。但如果希望输入“08 hello”会返回一个数值,那么除parseInt()外,其他方法都会失败并返回NaN。

 

编码约定

其额定并遵循编码约定是非常重要的,这可以使得代码更为一致、可预测、更容易阅读和理解。一个新加入团队的开发者通过了解编码约定,可以很快提高工作效率,理解团队其他人员编写的代码。

在会议和邮件列表中经常会爆发关于特定编码约定的激烈讨论(例如编码缩进是应该使用tab还是空格)。因此,如果在您的组织里建议采纳一个编码约定,请务必有心理准备面对抵触,以及听到不同的但同样有力的观点。记住,确定并一致遵循约定比这个具体约定是什么更为重要。

 

缩进

没有缩进的代码是很难阅读的。如果代码使用了不一致的缩进,也是很令人头痛的事情。因为这样做看起来遵循了约定,但是会导致很多令人困惑的疑问。标准化使用缩进是非常重要的。

一些程序员喜欢使用tab来进行缩进(比如我),因为任何人都可以调整编辑器来显示tab,tab可以以自定义为若干个空格。一些程序员喜欢直接使用空格来缩进,通常使用4个空格。只要团队中所有人都遵循相同的约定就可以了。

那么需要对哪些内容进行缩进呢?规则很简单,只需要对大括号中所有的代码执行缩进。这主要包含函数体、循环体(do、while、for、for-in)、if语句、switch语句和对象字面量引用的属性。

 

大括号

应该经常使用大括号,甚至在可选的情形下,都请使用大括号。技术上来说,在if语句和for语句中如果仅有一行语句,可以不需要大括号,但为了一致性和更方便升级,最好还是使用大括号。

想像一下有一个for循环中仅有一条语句,可以忽略该大括号并不会有语法错误:

// 不推荐方法
for (var i = 0; i < 10; i++) alert(i);

 

但是如果以后为该循环体增加了其他语句,会如何呢?

// 不推荐方法
for (var i = 0; i < 10; i++)
    alert(i);
    alert(i + " is " + (i % 2 ? "odd" : "even"));

 

尽管采用了缩进,第二个alert语句还是在循环体外面。最好的办法就是一直使用大括号,甚至在循环体中仅有一条语句。

// 推荐方法
for (var i = 0; i < 10; i++){
    alert(i);
}

 

 

开放的大括号位置

开发人员在将开放的大括号放置于什么位置有不同的选择,是和语句放在同一行还是放在接下来的一行呢?

// 1. 同行
if (true){
    alert("It's TRUE!");
}

// 2. 不同行
if (!false)
{
    alert("It's FALSE!");
}

 

在这个特定的规范中,采用哪种方式只是个人习惯的不同。但是有些情形下随着大括号的位置不同,程序的执行结果也会有所不同。这是由分号插入机制(semicolon insertion mechanism)导致的。JavaScript对代码不会很挑剔,当没有正确使用分号结束本语句时,它会自动补上。该行为在函数返回一个对象字面量并且开放的大括号位于接下来的一行时会导致问题:

// 警告: 未预期的返回值
function func(){
    return
    {
        name: "Peak"
    };
}

 

如果期望该函数返回一个有name属性的对象时,您可能会很惊讶。因为由于隐式添加了分号,该函数返回了一个未定义的值。函数运行到“return ;”则停止。推荐的做法:

function func(){
    return {
        name: "Peak"
    };
}

 

注意:关于分号的注释:和大括号一样,应该一直使用分号,甚至JavaScript解释器会隐式增加。这不仅是严格记录和代码的编写方式,也会有助于避免之前范例中含糊不清的情况。

 

空格

使用空格也有助于改善代码的可读性和一致性。在撰写英文文章时在逗号和区间范围后面使用空格。在JavaScript采用同样的逻辑,可在列表表达式(等价于逗号)和语句结束(等价于完成一次“思考”)后面添加空格。

使用空格比较好的位置包含如下:

1. 在分开for循环的各个部分的分号之后:例如,for (var i = 0; i < 10; i++){ ... }

2. 在for循环中初始化多个变量(i和最大值等):例如,for (var i = 0, max = 10; i < max; i++){ ... }

3. 在限定数组项的逗号后面:var a = [1, 2, 3];

4. 对象属性的逗号之后和将属性名和属性值分开的冒号之后:var o = {a: 1, b: 2};

5. 分隔开函数中各个参数的逗号之后:myFunc(a, b, c);

6. 在函数声明的大括号之前:function myFunc() {};

7. 在匿名函数表达式之后:var myFunc = function () {};

空格另外一个很好的用途是用来分隔所有的操作符和操作,这也就意味着在+、-、*、/、=、<、>、<=、>=、==、===、!=、!==、&&、||、+=、-=等之后使用空格。

最后一点关于使用空格的庆幸是和大括号有关的,在如下情形使用空格是比较好的做法:

1. 在函数中使用大括号开始符之前,例如if-else语句、循环语句和对象字面量等。

2. 在大括号结束符和else或while之间。

大量使用空格的可能会导致文件长度变长,但我们可以对代码进行压缩。

注意:一个常用的增加可读性的做法是使用垂直的空格。可以使用空行来分割代码的不同单元,就像在文章中使用空行来分隔不同的想法一样。

 

命名约定

另一个提高代码可预测性和可维护性的方法是使用命名约定。这就意味着采用一致的方法来对变量和函数进行命名。

构造函数的首字母的大写

JavaScript没有类,但是可以通过new调用构造函数:

var peak = new Person();

 

因为构造函数仍然仅仅是一个函数,它看起来是一个函数名,它和构造函数或者普通函数的行为差不多。

构造函数的首字母大写这样的命名方式就包含了以上定义。首字母小写的函数名和方法表明这些函数和方法不能使用new来调用:

// 构造函数
function MyConsturctor(){}
// 函数
function myFunction(){}

 

分隔单词

当变量名和函数名是由多个单词组成时,遵循如何将这些单词分隔开的约定是一个不错的主意。通常的约定是使用所谓的骆驼峰式命名方法。在骆驼峰式命名法约定中,所有的单词除去每个单词的首字母以外,都用小写表示。

对于构造函数,可以采用大骆驼峰式命名方法,例如MyConstructor(),而对于函数和方法名,可以使用小骆驼峰式命名方法,例如myFunction()、calculateArea()、getFirstName()等。

那么对于不是函数的变量,该如何命名呢?开发者通常使用小骆驼峰式命名法来为变量命名。另外有一个不错的方法是所有的单词都使用小写,并用下划线分隔开各个单词,例如first_name、favorite_band等。这种表示方法可以方便地很明显地区分开函数和其他标志——基本常量和对象。

ECMAScript使用骆驼峰式命名方法来为方法和属性进行命名,尽管多单词的属性名比较少见(例如:正则表达式对象中的lastIndex属性和ignoreCase属性)。

其它命名模式

有时候开发者使用命名约定来拟补或者代替语言的特性。

举例来说,在JavaScript中无法定义常量(尽管有一些内置的数值,例如Number.MAX_VALUE),因此开发者采用将变量名全部大写的约定来表示该变量在程序生命周期中不可改变,例如:

var PI = 3.1415926, MAX_WIDTH = 1000;

 

此外还有一种情形下,约定将所有的字符都大写:为全局变量命名时将有所有的字符大写。使用全部大写字符命名的全局变量命名方式可以使得这些变量很容易地被识别出来。

还有一种约定来模仿功能性的做法是私有成员函数约定。尽管在JavaScript中可以实现真正的私有函数,有时候开发者发现仅仅使用一个下划线前缀来标识私有方法或者私有属性是更为简单的一种方法。请考虑接下来的范例:

var person = {
    getName: function (){
        return this._getFirst() + " " + this._getLast();
    },
    _getFirst: function(){
        //...
    },
    _getLast: function(){
        //...
    }
}

 

在这个例子中,getName()意味着这是API的一个公开方法,而_getFirst()和_getLast()意味着这是一个私有函数。尽管它们都是普通的公开方法,但是使用下划线前缀的表示方法可以提醒使用person对象的用户,告诉他们这些方法在其他地方不能确保一定能够正常工作,不能直接调用。

下面是一些使用下划线约定的变量:

1. 使用下划线结尾来表明是私有变量,例如name_和getElements_()。

2. 使用一个下划线前缀来标识受保护属性,使用两个下划线前缀来标识私有属性。

3. 在Firefox中有一些属性,这些属性技术上不是JavaScript语言的一部分,它们采用两个下划线前缀和两个下划线后缀来命名,例如:__proto__and__parent__。

posted on 2013-09-30 17:10  雨梦萱橪  阅读(201)  评论(0编辑  收藏  举报