资讯专栏INFORMATION COLUMN

<<编写可维护的javascript>> 笔记3(语句和表达式)

OBKoro1 / 331人阅读

摘要:所有的块语句都应当使用花括号包括花括号的对齐方式第一种风格第二种风格块语句间隔第一种在语句名圆括号和左花括号之间没有空格间隔第二种在左圆括号之前和右圆括号之后各添加一个空格第三种在左圆括号后和右圆括号前各添加一个空格我个人喜欢在右括号之后添

所有的块语句都应当使用花括号, 包括:

if

for

while

do...while...

try...catch...finally

3.1 花括号的对齐方式

// 第一种 java风格
if(condition) {
    doSomething();
}else {
    doSomethingElse();
}

// 第二种 C#风格
if(condition) {
    doSomething();
}
else 
{
    doSomethingElse();
}

3.2 块语句间隔

// 第一种 在语句名、圆括号和左花括号之间没有空格间隔
if(condition){
    doSomething();
}

// 第二种 在左圆括号之前和右圆括号之后各添加一个空格
if (condition) {
    doSomething();
}

// 第三种 在左圆括号后和右圆括号前各添加一个空格
if ( condition ) {
    doSomething();
}

// 我个人喜欢 在右括号之后添加一个空格
if(condition) {
    doSomething();
}

我认为我的这种写法不仅看起来紧凑而且对于条件判断也更易读. 第二种风格也是用的很广泛,这种风格是第一种和第三种的折衷.

3.3 switch语句
源自C, 但是Java和Javascript中又没有完全相同的语法. js中的switch语句和其他语言是不一样的: switch语句中可以使用任意类型值, 任何表达式都可合法的用于case从句. 但在其他语言中则必须使用原始值和常量.

3.3.1 缩进
大体分为两种格式:

// 第一种 个人倾向于这种
switch(condition) {
    case "first": 
         // 代码
         break;
         
    case "second":
         // 代码
         break;
         
    case "third":
         // 代码
         break;
         
    default:
         // 代码 
}

// 第二种 Crockford的编程规范和Dojo编程风格指南提倡
switch(condition) {
case "first": 
     // 代码
     break;
case "second":
     // 代码
     break;
case "third":
     // 代码
     break;
default:
     // 代码
}

3.3.2 case语句的"连续执行"

switch(condition) {

    // 明显的依次执行
    case "first":  
    case "second":
         // 代码
         break;
         
    case "third":
         // 代码
         break;
         
    default:
         // 代码
}

只要是有意为之并且添加了注释的, 就可以使用case语句的连续执行.

3.3.3 default
是否需要default.

// 第一种 不应该省略default, 哪怕毛事没有.
switch(condition) {
    case "first": 
         // 代码
         break;
         
    case "second":
         // 代码
         break;
         
    default:
         // default中没有逻辑
}

// 第二种 没有默认行为且写了注释的情况下省略default 个人倾向于这种
switch(condition) {
    case "first": 
         // 代码
         break;
         
    case "second":
         // 代码
         break;
         
    // 没有default
}

3.4 with语句
with语句可以更改包含的上下文解析变量的方式. 通过with可以用局部变量和函数的形式来访问特定对象的属性和方法, 这样就可以将对象前缀统统省略掉.如果一段代码中写了很多对象的成员, 则可以使用with语句来缩短这段代码.

var book = {
    title: "编写可维护的js",
    author: "Nicholas"
};

var message = "The book is ";

with(book) {
    message += title;
    message += " by " + author;
}

这个例子中, with语句花括号内的代码中的book属性都是通过局部变量来读取的,

3.5 for循环
有两种方法可以更改循环的执行过程(除了使用return或throw语句). 第一种方法是使用break语句. 不管所有的循环迭代有没有执行完毕, 使用break总是可以立即退出循环.

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

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

这个循环执行两次, 在第三次执行process()之前就终止循环了.

第二种更改循环执行过程的方法是使用continue. continue语句可以立即退出(本次)循环, 而进入下一次循环迭代.

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

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

这里的循环执行两次, 跳过第三次直接进入第四次, 然后一直执行到最后一次.
Crockford的编程规范不允许使用continue, 主张与其使用continue不如使用条件语句. 上面的例子可以修改成这样.

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

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

推荐尽可能避免使用continue, 使用应当根据代码的可读性来决定.

3.6 for-in循环
for-in遍历对象属性. 返回属性名.
for-in有个问题, 不仅遍历对象的实例属性, 还会遍历出来从原型继承来的属性. 当遍历自定义对象的属性时, 往往会因为意外的结果而终止. 由于这样最好使用hasOwnProperty()方法来为for-in循环出实例属性.

// 不遍历从原型继承来的属性
for(var prop in object){
    if(object.hasOwnProperty(prop)) {
       console.log("Property name is " + prop); 
       console.log("Property value is " + object[prop]);
    }
}

// 包含遍历从原型继承来的属性
for(var prop in object){
    console.log("Property name is " + prop); 
    console.log("Property value is " + object[prop]);
}

// 最好不要用for-in来遍历数组 会有潜在的错误
var items= [1, 2, 3, 4, 5];

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/87373.html

相关文章

  • &lt;&lt;编写维护javascript&gt;&gt; 笔记1(基本格式化)

    摘要:程序是写给人读的只是偶尔让计算机执行一下当你刚刚组建一个团队时团队中的每个人都各自有一套编程习惯毕竟每个成员都有着不同的背景有些人可能来自某个皮包公司身兼数职在公司里面什么事都做还有些人会来自不同的团队对某种特定的做事风格情有独钟或恨之入骨 程序是写给人读的,只是偶尔让计算机执行一下. Donald Knuth 当你刚刚组建一个团队时,团队中的每个人都各自有一套编程习惯.毕竟,...

    wfc_666 评论0 收藏0
  • &lt;&lt;编写维护javascript&gt;&gt; 笔记5(UI层松耦合)

    摘要:由于第四章太稀松平常了于是就直接跳到第五章了这里我就草草的说一下第四章的几个点吧在严格模式的应用下不推荐将用在全局作用域中相等推荐尽量使用和守则如果是在没有别的方法来完成当前任务这时可以使用原始包装类型不推荐创建类型时用等创建类型从这一章节 由于第四章太稀松平常了, 于是就直接跳到第五章了.这里我就草草的说一下第四章的几个点吧 在严格模式的应用下 不推荐将use strict;用在全...

    saucxs 评论0 收藏0
  • &lt;&lt;编写维护javascript&gt;&gt; 笔记8(避免�39;空比较&#

    摘要:中常常会看到这种代码变量与的比较这种用法很有问题用来判断变量是否被赋予了一个合理的值比如不好的写法执行一些逻辑这段代码中方法显然是希望是一个数组因为我们看到的拥有和这段代码的意图非常明显如果参数不是一个数组则停止接下来的操作这种写法的问题在 js中, 常常会看到这种代码: 变量与null的比较(这种用法很有问题), 用来判断变量是否被赋予了一个合理的值. 比如: const Contr...

    young.li 评论0 收藏0
  • &lt;&lt;编写维护javascript&gt;&gt; 笔记2(注释)

    摘要:注释是代码中最常见的组成部分它们是另一种形式的文档也是程序员最后才舍得花时间去写的但是对于代码的总体可维护性而言注释是非常重要的一环打开一个没有任何注释的文件就好像趣味冒险但如果给你的时间有限这项任务就变成了折磨适度的添加注释可以解释说明代 注释是代码中最常见的组成部分.它们是另一种形式的文档,也是程序员最后才舍得花时间去写的.但是,对于代码的总体可维护性而言,注释是非常重要的一环.打...

    renweihub 评论0 收藏0
  • &lt;&lt;编写维护javascript&gt;&gt; 笔记9(将配置数据从代码中分离出来

    摘要:代码无非是定义一些指令的集合让计算机来执行我们常常将数据传入计算机由指令对数据进行操作并最终产生一个结果当不得不修改数据时问题就来了任何时候你修改源代码都会有引入的风险且值修改一些数据的值也会带来一些不必要的风险因为数据时不应当影响指令的正 代码无非是定义一些指令的集合让计算机来执行. 我们常常将数据传入计算机, 由指令对数据进行操作, 并最终产生一个结果. 当不得不修改数据时问题就来...

    xbynet 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<