`

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