Node开发规范v1.0_.20241127

news/2025/1/8 22:33:59/文章来源:https://www.cnblogs.com/amadeuslee/p/18650646

一、空格与格式

(一)缩进

采用2个空格缩进,而不是tab缩进。 空格在编辑器中与字符是等宽的,而tab可能因编辑器的设置不同。2个空格会让代码看起来更紧凑、明快。

变量声明

永远用var声明变量,不加var时会将其变成全局变量,这样可能会意外污染上下文,或是被意外污染。 在ECMAScript 5的strict模式下,未声明的变量将会直接抛出ReferenceError异常。

需要说明的是,每行声明都应该带上var,而不是只有一个var,示例代码如下:

var assert = require('assert'), fork = require('child_process').fork, net = require('net'), EventEmitter = require('events').EventEmitter;

错误示例如下所示:

var assert = require('assert')

, fork = require('child_process').fork

, net = require('net')

, EventEmitter = require('events').EventEmitter;

(二)空格

在操作符前后需要加空格,比如+、-、*、%、=等操作符前后都应该存在一个空格,示例如下:

var foo = 'bar' + baz;

错误的示例如下所示:

var foo='bar'+baz;

此外,在小括号前后应该存在空格,如:

if (true) {

// some code

}

错误的示例如下所示:

if(true){

// some code

}

(三)单双引号

由于双引号在别的场景下使用较多,在Node中使用字符串时尽量使用单引号,这样无需转义,如:

var html = 'CNode';

而在JSON中,严格的规范是要求字符串用双引号,内容中出现双引号时,需要转义。

大括号的位置

一般情况下,大括号无需另起一行,如

if (true) {// some code}

错误的示例如下:

if (true)

{

// some code

}

(四)逗号

逗号用于变量声明的分隔或是元素的分隔。如果逗号不在行结尾,前面需要一个空格。此外,逗号不允许出现在行首,比如: var foo = 'hello', bar = 'world'; // 或是 var hello = { foo: 'hello', bar: 'world' }; // 或是 var world = ['hello', 'world'];错误示例如下:


var foo = 'hello', bar = 'world';// 或是var hello = {foo: 'hello', bar: 'world'};// 或是var world = ['hello', 'world'];

(五)分号

给表达式结尾添加分号。尽管JavaScript编译器会自动给行尾添加分号,但还是会带来一些误解,示例如下:

function add() {

var a = 1, b = 2

return

a + b

}

将会得到undefined的返回值。因为自动加入分号后会变成如下的样子:

function add() {

var a = 1, b = 2;

return;

a + b;

}

后续的a + b将不会执行。

而如下的代码:

x = y

(function () {

}())

执行时会得到:

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

由于自动添加分号可能带来未预期的结果,所以添加上分号有助于避免误会。

二、命名规范

在编码过程中,命名是重头戏。好的命名可以令代码赏心悦目,带来愉悦的阅读享受,令代码具有良好的可维护性。命令的主要范畴有变量、常量、方法、类、文件、包等。

(一)变量命名

变量名都采用小驼峰式命名,即除了第一个单词的首字母不大写外,每个单词的首字母都大写,词与词之间没有任何符号,如:

var adminUser = {};

错误的示例如下:

var admin_user = {};

(二)方法命名

方法命名与变量命名一样,采用小驼峰式命名。与变量不同的是,方法名尽量采用动词或判断性词汇,如:

var getUser = function () {};var isAdmin = function () {};

User.prototype.getInfo = function () {};

错误示例如下:

var get_user = function () {};var is_admin = function () {};

User.prototype.get_info = function () {};

(三)类命名

类名采用大驼峰式命名,即所有单词的首字母都大写,如:

function User {

}

(四)常量命名

作为常量时,单词的所有字母都大写,并用下划线分割,如:

var PINK_COLOR = "pink";

(五)文件命名

命名文件时,请尽量采用下划线分割单词,比如child_process.js和string_decode.js。如果你不想将文件暴露给其他用户,可以约定以下划线开头,如_linklist.js。

(六)包名

也许你有贡献模块并将其打包发布到NPM上。在包名中,尽量不要包含js或node的字样,它是重复的。包名应当适当短且有意义的,如:

var express = require('express');

三、比较操作

在比较操作中,如果是无容忍的场景,请尽量使用=代替,否则你会遇到下面这样不符合逻辑的结果:

'0' == 0; // true'' == 0 // true'0' === '' // false

此外,当判断容忍假值时,可以无需使用=。在下面的代码中,当foo是0、undefined、null、false、''时,都会进入分支:

if (!foo) {

// some code

}

四、字面量

请尽量使用{}、[]代替new Object()、new Array(),不要使用string、bool、number对象类型,即不要调用new String、new Boolean和new Number。

五、作用域

在JavaScript中,需要注意一个关键字和一个方法,它们是with和eval(),容易引起作用域混乱。

慎用with

示例代码如下:

with (obj) {

foo = bar;

}

它的结果有可能是如下四种之一:obj.foo = obj.bar;、obj.foo = bar;、foo = bar;、foo = obj.bar;,这些结果取决于它的作用域。如果作用域链上没有导致冲突的变量存在,使用它则是安全的。但在多人合作的项目中,这并不容易保证,所以要慎用with。

慎用eval()

慎用eval()的原因与with相同。如果不影响作用域上已存在的变量,用它是安全的。另外,利用eval()的这个特性,也可以玩出一些好玩的特性来,比如wind.js利用它实现了流程控制,详见第4章。在大多数情况下,基本上轮不到eval()来完成特殊使命。示例代码如下:

var obj = {foo: 'hello',bar: 'world'

};var key = (Math.round(Math.random() * 100) % 2 === 0) ? 'foo' : 'bar';var value = eval('(obj.' + key + ')');

上述代码多出现在新手中,实际只要如下一行代码即可完成:

var value = obj[key];

六、数组与对象

在JavaScript中,数组其实也是对象,但是两者在使用时有些细节需要注意。

字面量格式

创建对象或者数组时,注意在结尾用逗号分隔。如果分行,一行只能一个元素,示例代码如下:


var foo = ['hello', 'world'];var bar = {hello: 'world',pretty: 'code'};

错误示例如下所示:

var foo = ['hello','world'];var bar = {

hello: 'world', pretty: 'code'

};

for in循环

使用for in循环时,请对对象使用,不要对数组使用,示例代码如下:

var foo = [];foo[100] = 100;for (var i in foo) {console.log(i);}for (var i = 0; i < foo.length; i++) {console.log(i);}

在上述代码中,第一个循环只打印一次,而第二个循环则打印0~100,这并不满足预期值。

不要把数组当做对象使用

尽管在JavaScript内部实现中可以把数组当做对象来使用,如下所示:

var foo = [1, 2, 3];

foo['hello'] = 'world';

这在for in迭代时,会得到所有值:

for (var i in foo) {

console.log(foo[i]);

}

也许你只是想得到hello而已。

七、异步

在Node中,异步使用非常广泛并且在实践过程中形成了一些约定,这是以往不曾在意的点。

异步回调函数的第一个参数应该是错误指示,并不是所有回调函数都需要将第一个参数设计为错误对象。但是一旦涉及异步,将会导致try catch无法捕获到异步回调期的异常。将第一个参数设计为错误对象,告知调用方是一个不错的约定。示例代码如下:

function (err, data) {

};

这个约定被很多流程控制库所采用。遵循这个约定,可以享受社区流程控制库带来的业务编写便利。

执行传入的回调函数

在异步方法中一旦有回调函数传入,就一定要执行它,且不能多次执行。如果不执行,可能造成调用一直等待不结束,多次执行也可能会造成未期望的结果。

八、类与模块

在Node中,如果要将一个类作为一个模块,就需要在意它的导出方式。

类继承

一般情况下,我们采用Node推荐的类继承方式,示例代码如下:


function Socket(options) {// …stream.Stream.call(this);// …}util.inherits(Socket, stream.Stream);

导出

所有供外部调用的方法或变量均需挂载在exports变量上。当需要将文件当做一个类导出时,需要通过如下的方式挂载:

module.exprots = Class;

而不是通过

exports = Class;

私有方法无需因为测试等原因导出给外部,所以无须挂载。

九、注解规范

一般情况下,我们会对每个方法编写注释,这里采用dox的推荐注释,示例如下:


/**- Queries some records
- Examples:
- ```
- query('SELECT * FROM table', function (err, data) {
- // some code
- });
- ```
- @param {String} sql Queries
- @param {Function} callback Callback*/exports.query = function (sql, callback) {// …};

dox的注释规范源自于JSDoc。可以通过注释生成对应的API文档。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/863479.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ABAP开发规范V1.0_.20241127

1. 概要 1.1目的 该文档定义了在开发与维护ABAP程序过程中必须遵守的规范与标准。该文档应当被视为一个动态的文档,该文档会根据需要进行增补和修订。 开发规范的重要作用在于保持整个开发团队的开发风格一致,提高程序质量,降低维护压力。 1.2适用范围 所有ABAP开发及系统配…

浙江单考单招政策解读!(内含浙江单招院校名单)

浙江单考单招政策解读!(内含浙江单招院校名单) 浙江单考单招: 浙江单招,即浙江省普通高校招生单独考试,浙江单招的考试科目通常包括文化课和职业技能测试(分为理论课和操作两部分),很多考生对浙江单招政策还有很多疑问,小编整理了浙江单招政策常见的一些政策问题及单…

如何评估员工是否以客户为中心

达到或超过期望值他能够与客户的反对意见打交道,应对它们,并使客户相信他的观点的优点。 他能为任何客户找到正确的方法,即使是最关键的客户。 他对客户总是很有礼貌和友好。他在谈话中从不打断他们。 他不能让客户失望。如果他承诺过要做什么,他就会履行承诺。 他总是关心…

antdVue 合并a-table相同内容行的方法

{title: "核算项",dataIndex: "hesxName",key: "hesxName",align: "center",customRender: (text, record, index) => {const obj = {children: text !== null ? text : "",attrs: {},};obj.attrs.rowSpan = this.merge…

在jooq的POJO类中使用Lombok的Data注解

jooq生成pojo类的配置根据官方给的如下: https://www.jooq.org/doc/3.14/manual/getting-started/tutorials/jooq-in-7-steps/jooq-in-7-steps-step3/如果想要使用lombok注解,需要自定义生成器。原生的参数并不足够支持这样做。另外一般也不需要这样做,因为更推荐把生成的代…

01.03 CW 模拟赛 T1. math

前言 赛场上 \(\rm{while}\) 打成 \(\rm{if}\) 痛失 \(40 \rm{pts}\) 不过下来看是贪心的话也没什么好做的了, 一般都不会 对了这是题目 题目下载 \(\rm{sol}\) 方法 \(1\) : 逐位计算 思路 显然的是你需要把数字从大到小填入, 使得高位的数尽量大, 这个显然 由上面的结论可以知…

电商团队信息共享的最佳方案:在线协同工具的应用

电商行业发展迅速,竞争也日益激烈,团队协作效率已成为企业能否脱颖而出的决定性因素。一个高效的电商团队不仅需要快速反应和高效执行,更需要具备流畅的沟通和协同机制。而在线协同编辑文档工具,正是推动这一机制的核心工具之一。 电商团队架构的挑战与需求 电商团队通常由…

体验领礼啦!体验自建数据库迁移到阿里云数据库RDS,领取桌面置物架!

​「技术解决方案【Cloud Up 挑战赛】」上线了! RDS MySQL 支持实例管理、账号管理、数据库管理、备份恢复、白名单、透明数据加密以及数据迁移等基本功能,还支持读写分离、SQL审计、多可用区集群等高级功能。经过双十一高并发、大数据量的考验,RDS MySQL 拥有优良的性能。 …

接入企业微信审批开发记录

背景 客户提了关于对接企业微信【审批】功能的需求,具体需求包括: 1、当企业微信审批流程到达某个节点后,能将审批信息推送到我们系统,或者我们系统能够拉取某个流程的信息; 2、能在审批流程中嵌套一个评价节点,跳转我们系统的评价页面。1 调研企业微信是否支持 根据这篇…

并发编程 StampedLock

StampedLock是JDK8引入的,是为了优化读的性能乐观读:tryOptimisticRead方法内没有加任何锁,在真正进行读取操作之前要进行一次查验,即validate,因为在获取stamp后,到读取操作之间,可能会有并发问题。 如果查验结果为false,就会升级为读锁

【硬件测试】基于FPGA的8PSK调制解调系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR

1.算法仿真效果 本文是之前写的文章:基于FPGA的8PSK调制解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR-CSDN博客的硬件测试版本。在系统在仿真版本基础上增加了ila在线数据采集模块,vio在线SNR设置模块,数据源模块。硬件ila测试结果如下:(完整代码运…

Linux 安装和配置openssl

使用python3.10版本时遇到无法加载.ssl的报错,解决方法如下: 1. 检查openssl的当前版本,如果已经是openssl-1.1.1w,则跳过下文,应该不是同一个问题。openssl version OpenSSL 1.0.2k-fips 26 Jan 2017 2. 下载openssl-1.1.1w版本的压缩包 openssl-1.1.1w.tar.gz3. 解压压…