Heim > Web-Frontend > js-Tutorial > Hauptteil

Eine kurze Analyse des Front-End-JavaScript-Programmierstils

黄舟
Freigeben: 2017-03-02 15:24:00
Original
968 Leute haben es durchsucht

Vorwort

Viele Unternehmen und Organisationen haben ihre Stilspezifikationen veröffentlicht. Weitere Informationen finden Sie unter jscs.info. Der folgende Inhalt bezieht sich hauptsächlich auf die JavaScript-Stilspezifikationen. Natürlich gibt es auch Programmiervorschläge von Google usw. Programmierstil

In diesem Kapitel wird erläutert, wie Sie die neue Syntax von ES6 in Kombination mit der traditionellen JavaScript-Syntax verwenden, um vernünftig und einfach zu schreiben -Code lesen und pflegen.

Programmierstil

Geltungsbereich auf Blockebene

(1) let ersetzt var

ES6 schlägt zwei neue Deklarationen vor Variablenbefehle: let und const. Unter diesen kann let var vollständig ersetzen, da die Semantik der beiden gleich ist und let keine Nebenwirkungen hat.

'use strict';
if (true) {
  let x = 'hello';
}
for (let i = 0; i < 10; i++) {
  console.log(i);
}
Nach dem Login kopieren

Hinweis: Wenn im obigen Code var anstelle von let verwendet wird, werden tatsächlich zwei globale Variablen deklariert, was offensichtlich nicht beabsichtigt ist. Variablen sollten nur innerhalb des Codeblocks gültig sein, in dem sie deklariert sind. Der Befehl var kann dies nicht tun.

Der var-Befehl hat einen variablen Heraufstufungseffekt, aber der let-Befehl hat dieses Problem nicht:

&#39;use strict&#39;;

if(true) {
  console.log(x); // ReferenceError
  let x = &#39;hello&#39;;
}
Nach dem Login kopieren

Hinweis: Wenn der obige Code var anstelle von let verwendet, wird die Zeile console.log angezeigt meldet keinen Fehler, gibt aber undefiniert aus, da die Variablendeklaration an den Kopf des Codeblocks gehoben wird. Dies verstößt gegen den Grundsatz, dass Variablen zuerst deklariert und später verwendet werden.

(2) Globale Konstanten und Thread-Sicherheit

Es gibt mehrere Gründe, warum const besser ist als let. Zum einen kann const Leute, die das Programm lesen, daran erinnern, dass sich diese Variable nicht ändern sollte. Zum anderen entspricht const eher der Idee der funktionalen Programmierung. Die Operation ändert den Wert nicht, sondern erstellt nur einen neuen Wert Dies ist auch förderlich für zukünftige verteilte Operationen. Der letzte Grund ist, dass der JavaScript-Compiler const optimiert, sodass die Verwendung von mehr const dazu beiträgt, die Ausführungseffizienz des Programms zu verbessern. Mit anderen Worten, der wesentliche Unterschied zwischen let und const ist tatsächlich der Unterschied in der internen Verarbeitung des Compilers.

// bad
var a = 1, b = 2, c = 3;

// good
const a = 1;
const b = 2;
const c = 3;

// best
const [a, b, c] = [1, 2, 3];
Nach dem Login kopieren

Hinweis: Die Deklaration einer const-Konstante hat zwei Vorteile: Erstens wird den Lesern des Codes sofort klar, dass der Wert nicht geändert werden sollte. Zweitens werden Fehler vermieden, die durch versehentliches Ändern des Variablenwerts verursacht werden . JavaScript verfügt möglicherweise über Multithread-Implementierungen (z. B. River Trail-Projekte von Intel). In diesem Fall sollten die durch let dargestellten Variablen nur in Code angezeigt werden, der in einem einzelnen Thread ausgeführt wird, und können nicht von mehreren Threads gemeinsam genutzt werden. Dies trägt zur Gewährleistung der Thread-Sicherheit bei.

String

Statische Strings verwenden immer einfache Anführungszeichen oder Backticks, aber keine doppelten Anführungszeichen. Dynamische Strings verwenden Backticks.

// bad
const a = "foobar";
const b = &#39;foo&#39; + a + &#39;bar&#39;;
// acceptable
const c = `foobar`;
// good
const a = &#39;foobar&#39;;
const b = `foo${a}bar`;
const c = &#39;foobar&#39;;
Nach dem Login kopieren

Destrukturierende Zuweisung

Bei der Zuweisung von Werten zu Variablen mithilfe von Array-Mitgliedern wird die destrukturierende Zuweisung bevorzugt.

const arr = [1, 2, 3, 4];
// bad
const first = arr[0];
const second = arr[1];
// good
const [first, second] = arr;
Nach dem Login kopieren

Wenn der Funktionsparameter Mitglied eines Objekts ist, wird eine destrukturierende Zuweisung bevorzugt.

// bad
function getFullName(user) {
  const firstName = user.firstName;
  const lastName = user.lastName;
}
// good
function getFullName(obj) {
  const { firstName, lastName } = obj;
}
// best
function getFullName({ firstName, lastName }) {
}
Nach dem Login kopieren

Wenn die Funktion mehrere Werte zurückgibt, wird die destrukturierende Zuweisung des Objekts anstelle der destrukturierenden Zuweisung des Arrays bevorzugt. Dies erleichtert das spätere Hinzufügen von Rückgabewerten und das Ändern der Reihenfolge der Rückgabewerte.

// bad
function processInput(input) {
  return [left, right, top, bottom];
}
// good
function processInput(input) {
  return { left, right, top, bottom };
}
const { left, right } = processInput(input);
Nach dem Login kopieren

Objekt

Ein in einer einzelnen Zeile definiertes Objekt, dessen letztes Element nicht mit einem Komma endet. Bei Objekten, die in mehreren Zeilen definiert sind, endet das letzte Element mit einem Komma.

// good
const a = { k1: v1, k2: v2 };
const b = {
  k1: v1,
  k2: v2,
};
Nach dem Login kopieren

Objekte sollten möglichst statisch sein. Sobald sie definiert sind, dürfen neue Attribute nicht nach Belieben hinzugefügt werden. Wenn das Hinzufügen von Attributen unvermeidlich ist, verwenden Sie die Methode Object.assign.

// if reshape unavoidable
const a = {};
Object.assign(a, { x: 3 });

// good
const a = { x: null };
a.x = 3;
Nach dem Login kopieren

Wenn der Attributname des Objekts dynamisch ist, können Sie ihn beim Erstellen des Objekts mithilfe von Attributausdrücken definieren.

// good
const obj = {
  id: 5,
  name: &#39;San Francisco&#39;,
  [getKey(&#39;enabled&#39;)]: true,
};
Nach dem Login kopieren

Array

Kopieren Sie ein Array mit dem Spread-Operator (…).

// bad
const len = items.length;
const itemsCopy = [];
let i;

for (i = 0; i < len; i++) {
  itemsCopy[i] = items[i];
}
// good
const itemsCopy = [...items];
Nach dem Login kopieren

Verwenden Sie die Methode Array.from, um ein Array-ähnliches Objekt in ein Array umzuwandeln.

const foo = document.querySelectorAll(&#39;.foo&#39;);
const nodes = Array.from(foo);
Nach dem Login kopieren

Funktion

Die Funktion zur sofortigen Ausführung kann in Form einer Pfeilfunktion geschrieben werden.

(() => {
  console.log(&#39;Welcome to the Internet.&#39;);
})();
Nach dem Login kopieren

In Situationen, in denen Funktionsausdrücke verwendet werden müssen, versuchen Sie stattdessen, Pfeilfunktionen zu verwenden. Weil dies prägnanter ist und dies bindet.

// bad
[1, 2, 3].map(function (x) {
  return x * x;
});
// good
[1, 2, 3].map((x) => {
  return x * x;
});
// best
[1, 2, 3].map(x => x * x);
Nach dem Login kopieren

Die Pfeilfunktion ersetzt Function.prototype.bind und sollte nicht mehr self/_this/that verwenden, um dies zu binden.

// bad
const self = this;
const boundMethod = function(...params) {
  return method.apply(self, params);
}

// acceptable
const boundMethod = method.bind(this);

// best
const boundMethod = (...params) => method.apply(this, params);
Nach dem Login kopieren

Für einfache, einzeilige und nicht wiederverwendbare Funktionen wird die Verwendung von Pfeilfunktionen empfohlen. Wenn der Funktionskörper komplex ist und viele Zeilen enthält, sollte die herkömmliche Methode zum Schreiben von Funktionen verwendet werden.

Alle Konfigurationselemente sollten in einem Objekt konzentriert sein und als letzter Parameter platziert werden. Boolesche Werte können nicht direkt als Parameter verwendet werden.

// bad
function pide(a, b, option = false ) {
}

// good
function pide(a, b, { option = false } = {}) {
}
Nach dem Login kopieren

Verwenden Sie im Funktionskörper keine Argumentvariablen, sondern stattdessen den Restoperator (…). Da der Rest-Operator explizit angibt, dass Sie die Parameter abrufen möchten, und es sich bei arguments um ein Array-ähnliches Objekt handelt, kann der Rest-Operator ein echtes Array bereitstellen.

// bad
function concatenateAll() {
  const args = Array.prototype.slice.call(arguments);
  return args.join(&#39;&#39;);
}

// good
function concatenateAll(...args) {
  return args.join(&#39;&#39;);
}
Nach dem Login kopieren

Verwenden Sie die Standardwertsyntax, um Standardwerte für Funktionsparameter festzulegen.

// bad
function handleThings(opts) {
  opts = opts || {};
}

// good
function handleThings(opts = {}) {
  // ...
}
Nach dem Login kopieren

Kartenstruktur

Verwenden Sie „Objekt“ nur, wenn Sie Entitätsobjekte in der realen Welt simulieren. Wenn Sie nur die Datenstruktur key:value benötigen, verwenden Sie die Map-Struktur. Weil Map über einen integrierten Traversalmechanismus verfügt.

let map = new Map(arr);
for (let key of map.keys()) {
  console.log(key);
}
for (let value of map.values()) {
  console.log(value);
}
for (let item of map.entries()) {
  console.log(item[0], item[1]);
}
Nach dem Login kopieren

Modulmodul

Modulsyntax ist die Standardmethode zum Schreiben von JavaScript-Modulen. Bleiben Sie bei dieser Schreibweise. Verwenden Sie „Import“ statt „Require“. Die übliche Schreibmethode ist wie folgt:

import { func1, func2 } from &#39;moduleA&#39;;
Nach dem Login kopieren

Verwenden Sie export anstelle von module.exports

// commonJS的写法
var React = require(&#39;react&#39;);

var Breadcrumbs = React.createClass({
  render() {
    return <nav />;
  }
});

module.exports = Breadcrumbs;

// ES6的写法
import React from &#39;react&#39;;

const Breadcrumbs = React.createClass({
  render() {
    return <nav />;
  }
});

export default Breadcrumbs
Nach dem Login kopieren

Wenn das Modul nur einen Ausgabewert hat, verwenden Sie export default Wenn Sie mehrere Ausgabewerte verwenden, verwenden Sie nicht den Exportstandard und verwenden Sie nicht gleichzeitig den Exportstandard und den normalen Export.

Verwenden Sie keine Platzhalter in Moduleingaben. Denn dadurch wird sichergestellt, dass es in Ihrem Modul eine Standardausgabe (Exportstandard) gibt.

import myObject from &#39;./importModule&#39;;
Nach dem Login kopieren

Wenn das Modul standardmäßig eine Funktion ausgibt, sollte der erste Buchstabe des Funktionsnamens ein Kleinbuchstabe sein. Dies ist auch der Codierungsstil der Benennung von Kamelfällen.

function makeStyleGuide() {}
export default makeStyleGuide;
Nach dem Login kopieren

如果模块默认输出一个对象,对象名的首字母应该大写。

const StyleGuide = {
  es6: {
  }
};
export default StyleGuide;
Nach dem Login kopieren

ESLint

ESLint是一个语法规则和代码风格的检查工具,可以用来保证写出语法正确、风格统一的代码。和lint的使用差不多
首先,安装ESLint。

npm i -g eslint
Nach dem Login kopieren

然后,安装Airbnb语法规则。

npm i -g eslint-config-airbnb
Nach dem Login kopieren

最后,在项目的根目录下新建一个.eslintrc文件,配置ESLint。

{
  "extends": "eslint-config-airbnb"
}
Nach dem Login kopieren

比如:

var unusued = &#39;I have no purpose!&#39;;

function greet() {
    var message = &#39;Hello, World!&#39;;
    alert(message);
}

greet();
Nach dem Login kopieren

然后我们使用命令,就可以检查语法的问题,并给出相关建议。

eslint index.js
Nach dem Login kopieren
$ eslint index.js
index.js
  1:5  error  unusued is defined but never used                 no-unused-vars
  4:5  error  Expected indentation of 2 characters but found 4  indent
  5:5  error  Expected indentation of 2 characters but found 4  indent

x 3 problems (3 errors, 0 warnings)
Nach dem Login kopieren

 以上就是前端 JavaScript 编程风格浅析 的内容,更多相关内容请关注PHP中文网(m.sbmmt.com)!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage