`
xubaoguo
  • 浏览: 79424 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Javascript编程风格

 
阅读更多

Douglas Crockford 是Javascript权威,Json格式 就是他的发明。

去年11月他有一个演讲(Youtube ),谈到了好的Javascript编程风格是什么。

我非常推荐这个演讲,它不仅有助于学习Javascript,而且能让你心情舒畅,因为Crockford讲得很幽默,时不时让听众会心一笑。

下面,我根据这个演讲和Crockford编写的代码规范 ,总结一下"Javascript编程风格"。

所谓"编程风格"(programming style),指的是编写代码的样式规则。 不同的程序员,往往有不同的编程风格。

有人说,编译器的规范叫做"语法规则"(grammar),这是程序员必须遵守的;而编译器忽略的部分,就叫"编程风格"(programming style),这是程序员可以自由选择的。这种说法不完全正确,程序员固然可以自由选择编程风格,但是好的编程风格有助于写出质量更高、错误更少、更易于维护的程序。

所以,有一点应该明确,"编程风格"的选择不应该基于个人爱好、熟悉程度、打字工作量等因素,而要考虑如何尽量使代码清晰易读、减少出错。你选择的,不是你喜欢的风格,而是一种能够清晰表达你的意图的风格。 这一点,对于Javascript这种语法自由度很高、设计不完全成熟 的语言尤其重要。

一、大括号的位置

绝大多数的编程语言,都用大括号({})表示区块(block)。起首的大括号的位置,有许多不同的写法

最流行的有两种。一种是起首的大括号另起一行:

  block

  {

    ...

  }

另一种是起首的大括号跟在关键字的后面:

  block {

    ...

  }

一般来说,这两种写法都可以接受。但是,Javascript要使用后一种,因为Javascript会自动添加句末的分号,导致一些难以察觉的错误。

  return

  {

    key:value;

  };

上面的代码的原意,是要返回一个对象,但实际上返回的是undefined,因为Javascript自动在return语句后面添加了分号。为了避免这一类错误,需要写成下面这样:

  return {

    key : value;

  };

因此,

  规则1:表示区块起首的大括号,不要另起一行。

二、 圆括号

圆括号(parentheses)在Javascript中有两种作用,一种表示调用函数,另一种表示不同的值的组合(grouping)。我们可以用空格,区分这两种不同的括号。

  规则2:调用函数的时候,函数名与左括号之间没有空格。

  规则3:函数名与参数序列之间,没有空格。

  规则4:所有其他语法元素与左括号之间,都有一个空格。

按照上面的规则,下面的写法都是不规范的:

  foo (bar)

  return(a+b);

  if(a === 0) {...}

  function foo (b) {...}

  function(x) {...}

三、分号

分号表示语句的结束。大多数情况下,如果你省略了句尾的分号,Javascript会自动添加。

  var a = 1

等同于

  var a = 1;

因此,有人提倡 省略句尾的分号。但麻烦的是,如果下一行的第一个字元(token)是下面这五个字符之一,Javascript将不对上一行句尾添加分号 :"("、"["、"/"、"+"和"-"。

  x = y

  (function (){

    ...

  })();

上面的代码等同于

  x = y(function (){...})();

因此,

  规则5:不要省略句末的分号。

四、with语句

with可以减少代码的书写,但是会造成混淆。

  with (o) {

    foo = bar;

  }

上面的代码,可以有四种运行结果:

  o.foo = bar;

  o.foo = o.bar;

  foo = bar;

  foo = o.bar;

这四种结果都可能发生,取决于不同的变量是否有定义。因此,

  规则6:不要使用with语句。

五、相等和严格相等

Javascript有两个表示"相等"的运算符:"相等"(==)和"严格相等"(===)。

因为"相等"运算符会自动转换变量类型,造成很多意想不到的情况

  0 == ''// true

  1 == true // true

  2 == true // false

  0 == '0' // true

  false == 'false' // false

  false == '0' // true

  " \t\r\n " == 0 // true

因此,

  规则7:不要使用"相等"(==)运算符,只使用"严格相等"(===)运算符。

六、语句的合并

有些程序员追求简洁,喜欢合并不同目的的语句。比如,原来的语句是

  a = b;

  if (a) {...}

他喜欢写成下面这样:

  if (a = b) {...}

虽然语句少了一行,但是可读性大打折扣,而且会造成误读,让别人误以为这行代码的意思是:

  if (a === b){...}

另外一种情况是,有些程序员喜欢在同一行中赋值多个变量:

  var a = b = 0;

他以为,这行代码等同于

  var a = 0, b = 0;

实际上不是,它的真正效果是下面这样:

  b = 0;

  var a = b;

因此,

  规则8:不要将不同目的的语句,合并成一行。

七、变量声明

Javascript会自动将变量声明"提升"(hoist)到代码块(block)的头部。

  if (!o) {

    var o = {};

  }

等同于

  var o;

  if (!o) {

    o = {};

  }

为了避免可能出现的问题,不如把变量声明都放在代码块的头部。

  for (var i ...) {...}

最好写成:

  var i;

  for (i ...) {...,}

因此,

  规则9:所有变量声明都放在函数的头部。

  规则10:所有函数都在使用之前定义。

八、全局变量

Javascript最大的语法缺点,可能就是全局变量对于任何一个代码块,都是可读可写。这对代码的模块化和重复使用,非常不利。

  规则11:避免使用全局变量;如果不得不使用,用大写字母表示变量名,比如UPPER_CASE。

九、new命令

Javascript使用new命令,从建构函数生成一个新对象。

  var o = new myObject();

这种做法的问题是,一旦你忘了加上new,myObject()内部的this关键字就会指向全局对象,导致所有绑定在this上面的变量,都变成全部变量。

  规则12:不要使用new命令,改用Object.create() 命令。

如果不得不使用new,为了防止出错,最好在视觉上把建构函数与其他函数区分开来。

  规则13:建构函数的函数名,采用首字母大写(InitialCap);其他函数名,一律首字母小写。

十、自增和自减运算符

自增(++)和自减(--)运算符,放在变量的前面或后面,返回的值不一样,很容易发生错误。

事实上,所有的++运算符都可以用"+= 1"代替。

  ++x

等同于

  x += 1;

代码变得更清晰了。有一个很可笑的例子,某个Javascript函数库的源代码中出现了下面的片段:

  ++x;

  ++x;

这个程序员忘了,还有更简单、更合理的写法:

  x += 2;

因此,

  规则14:不要使用自增(++)和自减(--)运算符,用+=和-=代替。

十一、区块

如果循环和判断的代码体只有一行,Javascript允许该区块(block)省略大括号。

下面的代码

  if (a) b(); c();

原意可能是

  if (a) { b(); c();}

但是,实际效果是

  if (a) { b();} c();

因此,

  规则15:总是使用大括号表示区块。

(完)

分享到:
评论

相关推荐

    浅谈Javascript编程风格

    JavaScript编程风格是编程实践中至关重要的一个方面,它不仅关乎个人编程习惯,更是直接影响代码的可读性、可维护性和减少潜在错误的关键因素。本文将基于Douglas Crockford的演讲和其编写的代码规范,探讨...

    JavaScript编程风格

    JavaScript编程风格是编程实践中的一种规范,旨在提高代码的可读性、可维护性和减少错误。以下是一些由JavaScript权威Douglas Crockford提出的编程风格建议: 1. **大括号的位置**: - 在JavaScript中,为了防止因...

    Dojo Javascript 编程规范 规范自己的JavaScript书写

    良好的JavaScript书写习惯的优点不言而喻,今天彬Go向大家推荐Dojo Javascript 编程规范,相当不错的 Javascript 编程风格规范,建议大家可以借鉴一下此规范编写 Javascript。感谢i.feelinglucky的翻译

    JavaScript编程精解 (第一版 带书签) 中文PDF扫描版

    《JavaScript编程精解 (第一版 带书签) 中文PDF扫描版》是一本专注于JavaScript(通常简称为JS)编程语言的书籍,涵盖了ES5(ECMAScript 2016标准)的编程技术。这本书适合那些希望提升前端开发技能的读者,特别是...

    JavaScript标准参考教程(alpha)

    最后一章“JavaScript编程风格”则介绍了代码书写的风格,包括大括号的位置、圆括号、缩进、行尾的分号、区块等编程习惯。 整体而言,《JavaScript标准参考教程(alpha)》是一本全面介绍JavaScript语言的教材,内容...

    JavaScript内核系列

    JavaScript的核心概念包括闭包、面向对象、原型等,这些都是构建JavaScript编程风格和应用的基础。 1. 闭包是指一个函数和其周围状态(词法环境)的引用捆绑在一起的组合。它允许函数在定义时的词法作用域外执行,...

    javascript个人学习总结:包括数据结构与算法,前端工程化等方面,助你快速入门

    Javascript编程风格 凹凸实验室前端代码规范 vuejs风格指南 代码安全指南 二.组件库与工具 zarm 基于react移动端组件库 antd-design 基于react pc端组件库 三.数据结构与算法 用JavaScript实现的算法和数据结构 ...

    Javascript风格要素

    ### 一、JavaScript编程风格的重要性 标题与描述均提及“JavaScript风格要素”,这表明了在编写JavaScript代码时,遵循一定的编程规范和风格对于提高代码可读性、维护性和执行效率具有至关重要的作用。正如《The ...

    JavaScript编程规范编程规范

    JavaScript编程规范旨在提升代码质量和可读性,是开发者遵循的一套约定和最佳实践。以下是根据提供的部分内容解析出的JavaScript编程规范的关键点: 1. **排版** - **规则1**:程序块使用4个空格缩进,不使用TAB,...

    javascript源码检测工具

    3. **代码风格**:JSLint推崇Crockford的JavaScript编程风格,比如强制使用特定的缩进方式、限制行长度、禁止使用特定的函数或语句(如with语句)等。 4. **类型检查**:JSLint会检查变量和表达式的类型,防止因...

    javascript函数式编程

    JavaScript函数式编程是利用JavaScript语言编写函数式风格代码的一种编程范式。函数式编程强调使用纯函数、避免副作用、函数的不可变性以及利用高阶函数等概念。通过阅读《JavaScript函数式编程指南》,读者可以了解...

    JavaScript编程规范详述与指南-JavaScript编程的基础指导方针和技术规范

    JavaScript编程规范详述与指南-JavaScript编程的基础指导方针和技术规范 内容概要:本文档提供了关于JavaScript编程的基础指导方针和技术规范,涵盖了JS文件的基本设置,源文件版式要求,变量命名习惯和编程的最佳...

    全面的前端开发资料汇总

    JavaScript编程风格 必须了解,否则有可能出现错误自己还不知道 Web技术文档 Mozilla权威标准 JavaScript的单线程性质以及定时器的工作原理 来自John Resig的文章,一次讨论,发现我组长也不理解JavaScript单线程,...

    Javascript面向对象编程.

    在提供的资源中,《代码之美》PDF文件可能包含了关于编程实践和代码风格的指导,而《Javascript面向对象编程》PPT可能更具体地阐述了JavaScript OOP的细节和示例。学习这些材料将有助于深入理解JavaScript的面向对象...

    javascript高级编程JavaScript.pdf

    尽管两种方式都能达到类似的效果,但它们在代码书写风格上有所不同,具体选择哪种取决于个人喜好和项目需求。 总的来说,使用命名空间可以有效地组织和管理JavaScript代码,减少全局作用域污染,避免命名冲突,提高...

    JavaScript编程宝典,编程学习

    函数是JavaScript的核心,特别是高阶函数,它们可以作为参数传递、返回值使用,实现函数式编程风格。闭包则提供了对作用域的控制,可以用来实现私有变量和延时执行等功能。异步编程是JavaScript中的另一大特色,包括...

Global site tag (gtag.js) - Google Analytics