A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from http://developer.mozilla.org/zh-CN/docs/MDN/Writing_guidelines/Code_style_guide/JavaScript below:

JavaScript ä»£ç ç¤ºä¾‹ç¼–å†™æŒ‡å— - MDN Web 文档项目

JavaScript 代码示例编写指南

以下指南涵盖了如何为 MDN Web Docs 编写 JavaScript 示例代码。本文列出了编写简洁示例的规则,以期这些示例将被尽可能多的人理解。

JavaScript 代码示例常规指南

本节解释了编写 JavaScript 代码示例时要牢记的一般准则。后面的部分将涵盖更具体的细节。

选择格式

关于正确缩进、空格和行的长度方面的观点一直存在争议。对这些主题的讨论会分散创作和维护内容的注意力。

在 MDN Web Docs,我们使用 Prettier 作为代码格式化工具以保持代码样式的一致性(同时避免偏离主题的讨论)。你可以查阅我们的配置文件了解当前规则,并阅读 Prettier 文档。

Prettier 格式化所有代码并保持风格一致。尽管如此,你还需要遵守一些额外的规则。

使用现代 JavaScript 特性

如果新的特性被每个主流的浏览器——Chrome、Edge、Firefox 和 Safari 所支持,你就可以使用它们。

数组 创建数组

请使用字面量而非构造函数来创建数组。

像这样来创建数组:

const visitedCities = [];

而不要这样创建数组:

const visitedCities = new Array(length);
添加元素

向数组添加元素时,请使用 push() 而非直接赋值。考虑有如下数组:

像这样向数组添加元素:

而不要像这样向数组添加元素:

pets[pets.length] = "cat";
异步方法

编写异步代码可以提高性能,应尽可能使用。特别是,你可以使用:

当两种语法都可行时,我们倾向于使用更简单的 async/await 语法。不幸的是,你不能在顶层使用 await,除非你在 ECMAScript 模块中。但 Node.js 使用 CommonJS 模块而不是 ES 模块。因此,如果你打算在所有地方使用该示例,请避免顶层的 await。

注释

注释对于编写良好的代码示例非常重要。它们清楚地阐明了代码的意图,并帮助开发者理解它。因此要特别注意它们。

使用单行注释

单行注释用 // 标记,与包含在 /* … */ 之间的块注释相反。

通常情况下,使用单行注释来注释代码。编写者必须用 // 标记每一行的注释,这样就更容易直观地注意到注释掉的代码。此外,这种约定允许在调试时使用 /* … */ 注释掉部分代码。

打印的输出 多行注释

简短的注释通常更好,所以尝试将他们保持在 60–80 个字符的单行中。如果这不可能,请在每行的开头使用 //:

// 这是一个多行注释的示例。
// 假设下面的函数有一些我想指出的不寻常的局限性。
// 局限 1
// 局限 2

请不要使用 /* … */:

/* 这是一个多行注释的示例。
  假设下面的函数有一些我想指出的不寻常的局限性。
  局限 1
  局限 2 */
使用注释来标记省略号

为了保持示例简短,我们需要使用省略号(…)来跳过冗余代码。尽管如此,编写者应该仔细考虑,因为开发者经常复制粘贴示例到他们的代码中,所以我们所有的示例代码都应该是有效的 JavaScript。

在 JavaScript 中,你应该将省略号(…)放在注释之中。可能的话,请指出重用此代码片段的人预计会添加什么操作。

对省略号(…)使用注释更加明确,可以防止开发人员复制和粘贴示例代码时出现错误。比如:

function exampleFunc() {
  // 在此处添加你的代码
  // …
}

请不要像这样这样使用省略号(…):

function exampleFunc() {
  …
}
注释掉参数

在编写代码时,你通常会省略你不需要的参数。但在某些代码示例中,你想要显式的说明你没有使用某些可能的参数。

为此,请在参数列表中使用 /* … */。这是只使用单行注释(//)的规则的一个例外。

array.forEach((value /* , index, array */) => {
  // …
});
函数 函数名称

对于函数名称,请使用以小写字母开头的小驼峰式命名。酌情使用简洁、可读的和语义化的名称。

以下是函数名称的正确示例:

function sayHello() {
  console.log("你好!");
}

请不要使用像这样的函数名称:

function SayHello() {
  console.log("你好!");
}

function doIt() {
  console.log("你好!");
}
函数声明 循环和条件语句 循环初始化

当需要循环时,从 for(;;)、for...of、while 等中选择合适的。

警告: 切勿使用 for...in 遍历数组和字符串。

备注: 考虑完全不使用 for 循环。如果你正在使用 Array(或者在某些操作中使用 String),请考虑使用更具语义的迭代方法,比如 map()、every()、findIndex()、find()、includes() 等。

控制语句

对于 if...else 控制语句,有一个值得注意的情况。如果 if 语句以 return 结尾,则不要添加 else 语句。

在 if 语句后继续,例如:

if (test) {
  // 如果 test 为真则执行某些操作
  // …
  return;
}

// 如果 test 为假则执行某些操作
// …

请不要这样写:

if (test) {
  //  如果 test 为真则执行某些操作
  // …
  return;
} else {
  // 如果 test 为假则执行某些操作
  // …
}
将大括号与控制流语句和循环一起使用

虽然像 if、for 和 while 的控制流语句不需要在内容中只有一个语句时使用大括号,但你总是应该使用大括号。比如:

for (const car of storedCars) {
  car.paint("红色");
}

不要这样写:

for (const car of storedCars) car.paint("红色");

这可以防止忘记在添加更多语句时添加大括号。

Switch 语句

switch 语句可能有点棘手。

错误处理

备注: 请记住,只有可恢复的错误才应该被捕获和处理。所有不可恢复的错误都应该被抛出,并在调用栈中逐级向上冒泡。

对象 对象名称 创建对象

对于创建普通对象(即,当不涉及类时),请使用字面量而非构造函数。

例如,这样做:

不要像这样创建普通对象:

const object = new Object();
对象类 方法

要定义方法,请使用方法定义语法:

const obj = {
  foo() {
    // …
  },
  bar() {
    // …
  },
};

而不是:

const obj = {
  foo: function () {
    // …
  },
  bar: function () {
    // …
  },
};
对象属性 运算符

本节列出了我们对使用哪些运算符以及何时使用的建议。

条件运算符

当你想要根据条件将一个字面量存储到变量中时,请使用条件(三元)运算符而不是 if...else 语句。此规则也适用于返回值时。比如:

const x = condition ? 1 : 2;

而不要这样:

let x;
if (condition) {
  x = 1;
} else {
  x = 2;
}

条件运算符在创建用来打印新信息的字符串时很有帮助。在这种情况下,使用常规的 if...else 语句会导致像打印日志这样的副操作变成长代码块,会混淆示例的重点。

严格相等运算符

优先使用严格相等(三等号)和不等运算符,而不是相等运算符(双等号)和不等运算符。

像这样使用严格相等和不等运算符:

name === "Shilpa";
age !== 25;

不要像下面这样使用宽松相等和不等运算符:

name == "Shilpa";
age != 25;

如果你需要使用 == 或 !=,请记住 == null 是唯一可接受的情况。由于 TypeScript 在所有其他情况下都会失败,因此我们不希望在示例代码中使用。考虑添加注释来解释你为什么需要它。

布尔值测试的简便方式

优先使用简便布尔值测试。例如,使用 if (x) 和 if (!x),而不是 if (x === true) 和 if (x === false),除非以不同的方式处理不同种类的真值或假值。

字符串

字符串字面量可以用单引号包含起来,比如 'A string',也可以用双引号包含起来,比如 "A string"。不过,请不要在意需要选择使用哪个,Prettier 会保持一致。

模版字面量

要将值插入字符串,请使用模板字面量。

变量 变量名称

好的变量名对理解代码至关重要。

备注: 唯一不允许使用可读性好的语义名称的地方是存在非常公认的惯例,例如将 i 和 j 用于循环迭代器。

变量声明

在声明变量和常量时,使用 let 和 const 关键字,而不是 var。下面的例子展示了 MDN Web 文档上推荐的和不推荐的用法:

强制类型转换

避免隐式强制类型转换。特别是,避免 +val 以强制将值转换未为数字,以及 "" + val 来将其强制转换为字符串。改为在不使用 new 的情况下使用 Number() 和 String()。例如:

class Person {
  #name;
  #birthYear;

  constructor(name, year) {
    this.#name = String(name);
    this.#birthYear = Number(year);
  }
}

不要这样写:

class Person {
  #name;
  #birthYear;

  constructor(name, year) {
    this.#name = "" + name;
    this.#birthYear = +year;
  }
}
要避免的 Web API

除了这些 JavaScript 语言特性之外,我们还建议你牢记一些与 Web API 相关的准则。

避免浏览器前缀

如果所有主流浏览器(Chrome、Edge、Firefox 和 Safari)都支持某个特性,请不要在该特性前面加上前缀。比如:

const context = new AudioContext();

避免增加前缀的复杂性,不要这样写:

const AudioContext = window.AudioContext || window.webkitAudioContext;
const context = new AudioContext();

同样的规则也适用于 CSS 前缀。

避免已弃用的 API

当一个方法、属性或一整个接口都已经弃用,不要使用它(除了它的文档)。相反,使用现代的 API。

以下是要避免的 Web API 以及用什么来替换它们的非详尽列表:

使用安全可靠的 API 使用合适的打印方法 参见

JavaScript 参考——浏览我们的 JavaScript 参考页面,查看一些优秀、简洁、有意义的 JavaScript 代码片段。


RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4