编写可维护的javascript(三):语句和表达式

本文介绍了JavaScript编程中的关键规范,包括块语句的花括号使用、快语句对齐风格、switch语句、for循环的使用及注意事项等。此外,还详细讲解了for-in循环的正确用法及其潜在的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

所有块语句都应当使用花括号,包括:if、for、while、do…while…

花括号的对齐方式
第一种对齐风格:

    if (condition) {
        doSomething();
    } else {
        doSomethingElse();
    }

javascript代码这种风格继承自Java,这在java的编程规范中有明确规定。
第二种对齐风格:

    if (condition)
    {
        doSomething();
    } else 
    {
        doSomethingElse();
    }

Google Javascript风格指南中明确禁止这种用法,以免导致错误的分号自动插入。
所以书中强烈推荐使用第一种花括号对齐风格。
快语句对齐风格

    // 1
    if(condition){
        doSomething();
    }

    // 2
    if (condition) {
        doSomething();
    }

    // 3
    if ( condition ) {
        doSomething()
    }

青睐于使用第二种风格的编码。
switch语句

    switch(condition) {
        case "first":
            // 代码
            break;
        case "second":
            // 代码
            break;

        default:
            // 代码(当没有默认行为的时候,可以省去default语法结构)
    }

for

    var values = [1, 2, 3, 4, 5, 6, 7],
        i, len;

    for (i=0, len=values.length; i < len; i++) {
        if (i == 2) {
            break;   // 迭代不会继续
        }
        process(values[i]);
    }

这里的循环体执行了两次,然后在第三次执行process()之前就终止循环了,尽管values数组中的元素超过三个。不管所有循环迭代有没有执行完毕,使用break总是可以立即退出循环。

    var values = [1, 2, 3, 4, 5, 6, 7],
        i, len;

    for (i=0, len=values.length; i < len; i++) {
        if (i == 2) {
            continue;   // 跳过本次迭代
        }
        process(values[i]);
    }

第二种改变循环过程使用continue,continue立即退出本次循环,而进入下次循环。这里的循环体将执行两次,跳过第三次迭代,而进入第四次迭代,循环继续执行直到最后一次迭代。

推荐尽可能避免使用continue,但不是禁止使用,应当根据代码可读性决定,比如可以将上一个例子修改为:

    var values = [1, 2, 3, 4, 5, 6, 7],
        i, len;

    for (i=0, len=values.length; i < len; i++) {
        if (i != 2) {
            process(values[i]);
        }
    }

for-in循环
for-in 循环是用来遍历对象属性的,循环遍历每个对象属性,并返回属性名而不是属性值,比如:

    var prop;

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

for-in 循环有一个问题,就是它不仅遍历对象的实例属性,还遍历从原型继承来的属性。
当遍历自定义对象的属性时,往往可能会发生意外。出于这个原因,最好使用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()。
当然如果你想要查找原型链,这时候就应当做出补充注释,如下:

    var prop;

    for (prop in object) { // 包含对原型链的遍历
        console.log("Property name is " + prop);
        console.log("Property value is " + object[prop]);
    }

关于for-in循环,还有一点需要注意,for-in循环是用来遍历对象的。
一个常见的错误是使用for-in循环来遍历数组成员,如下代码:

    var values = [1, 2, 3, 4, 5],
        i;

    for (i in values) {
        process(items[i]);
    }

始终记住,for-in循环是用来对实例对象和原型链的键做遍历的,而不是用来遍历包含数字索引的数组的。

文章内容从《编写可维护的Javascript》[美] Nicholas C. Zakas著 一书中总结写出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值