第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

全部開發(fā)者教程
首頁 慕課教程 ES6-10 入門教程 ES6-10 入門教程 ES6+ 實戰(zhàn)3-代碼整潔之道

前端代碼整潔之道

1. 前言

ES6 新增了很多語法和語法糖,在使用這些語法和語法糖的時候我們可以讓我們的代碼更加優(yōu)雅。另外,在程序上有一些約定俗成的東西,這樣會幫助我們更好地書寫和閱讀代碼。本節(jié)我們將學習前端代碼的整潔之道幫助你更好地書寫你的代碼。

2. 變量的使用

2.1 命名

在定義變量時最好使用駝峰命名(如:aaBbCc)的方式,并且要使用有準確意義的變量名,這樣容易閱讀。

// bad
var getname = function() { return 'imooc'; }
// good
var getName = function() { return 'imooc'; }

在聲明變量時不要添加沒必要的上下文,如果你的類名稱 / 對象名稱已經(jīng)說明了它們是什么,不要在 (屬性) 變量名里重復。

// bad
const dog = {
  dogType: '斗牛犬'
  dogColor: '黑色',
};
dog.dogType = '牧羊犬'

// good
const dog = {
  type: '斗牛犬'
  color: '黑色',
};
dog.type = '牧羊犬'

2.2 let 和 const 的選擇

ES6 提出了兩個新的聲明變量的命令:letconst 用于代替 var,使用 let 來聲明可變變量,使用 const 來聲明常量。對于全局環(huán)境下的常量,變量名可以使用純大寫加下劃線的方式命名。

let name = 'xiaoming';
name = 'Jack';

const PI_COUNT = 3.14;

{
  const lession = 'ES6 Wiki';
  console.log(lession);
}

在選擇 letconst 時,優(yōu)先使用 const,尤其是在全局環(huán)境,不應(yīng)該設(shè)置變量,只應(yīng)設(shè)置常量。

constlet 好的幾個原因。

  • 不會對值產(chǎn)生副作用,也就是值被修改,告訴開發(fā)者此變量不能被修改;
  • const 比較符合函數(shù)式編程思想,運算不改變值,只是新建值;
  • JavaScript 編譯器會對 const 進行優(yōu)化,所以多使用 const,有利于提高程序的運行效率,也就是說 letconst 的本質(zhì)區(qū)別,其實是編譯器內(nèi)部的處理不同。

在作用域內(nèi)聲明的變量需要使用,如果下文沒有用到就不要聲明。

// bad
const name = 'xiaoming';	// 下文沒有使用就不要定義了

// good
const name = 'xiaoming';
console.log(name);

2.3 字符串

對于靜態(tài)字符串一律使用單引號,不使用雙引號。在拼接字符串的時候需要使用反引號的方式,更加易于閱讀。

// bad
const name = "imooc";
const info = name + ' ES6 Wiki';

// good
const name = 'imooc';
const info = `${name} ES6 Wiki`;

2.4 解構(gòu)賦值

在批量定義有默認值的變量時可以使用數(shù)組的解構(gòu)賦值。

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

// good
const [a, b, c] = [1, 2, 3];

在獲取數(shù)組或?qū)ο笾兄禃r也可以優(yōu)先使用解構(gòu)的方式:

const arr = [1, 2, 3, 4];
const obj = {a: 1, b: 3};

// bad
const x = arr[0];
const y = arr[1];
const a = obj.a;
const b = obj.b;

// good
const [x, y] = arr;
const [a, b] = obj;

在函數(shù)參數(shù)中,如果函數(shù)接收的參數(shù)是一個對象時,可以直接在函數(shù)的括號中解構(gòu)對象,這樣可以在函數(shù)內(nèi)部之間使用變量。

// 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 }) {}

對于函數(shù)中有返回值是對象時,對象中屬性名和要返回的變量名相同時可以省了變量。

// bad
function foo() {
  const a = 'aaa';
  const b = 'bbb';
  
  return {
    a: a,
    b: b
  }
}

// good
function foo() {
  const a = 'aaa';
  const b = 'bbb';
  
  return { a, b }
}

2.5 盡量減少使用條件語法

在條件語句中,可以使用或( || )運算符來設(shè)置有默認值的變量。

// bad
function createPerson(name) {
  var newName;
  if (name) {
    newName = name;
  } else {
    newName = 'Jack';
  }
}
// good
function createPerson(name) {
  const newName = name || 'Jack';
}

如果符合條件運算符(?:)那就盡量使用條件運算符。

const age = 26;

// bad
let status = ''
if (age > 18) {
	status = '成年人'
} else {
  status = '未成年'
}
// good
const status = age > 18 ? '成年人' : '未成年';

3. 函數(shù)

3.1 使用箭頭函數(shù)

在定義匿名函數(shù)時最好使用箭頭函數(shù)的形式,更加簡潔。

// bad
const foo = function(){}
(function() { console.log('100') })()


// good
const foo = () => {}
(() => { console.log('100') })()

// best
[1, 2, 3].map(x => x * x);

當函數(shù)只有一個參數(shù),并且返回值是一個表達式時,可以將參數(shù)外的括號和表達式外的大括號都省略。

// bad
[1, 2, 3].map((x) => {
  return x * x;
});

// good
[1, 2, 3].map(x => x * x);

使用箭頭函數(shù)的另一個好處是,在箭頭函數(shù)內(nèi)部是不綁定 this 的,這樣在調(diào)用函數(shù)時 this 的指向是不會變的。

var title = "全局標題";
// bad
var imooc = {
	title: "慕課網(wǎng) ES6 Wiki",
	getTitle : function(){
		console.log(this.title);
	}
};
imooc.getTitle();		// 慕課網(wǎng) ES6 Wiki
var bar = imooc.getTitle;
bar();		// 全局標題

// good
var imooc = {
	title: "慕課網(wǎng) ES6 Wiki",
	getTitle : () => {
		console.log(this.title);
	}
};
imooc.getTitle();		// 全局標題
var bar = imooc.getTitle;
bar();		// 全局標題

3.2 函數(shù)參數(shù)

在函數(shù)傳參時,參數(shù)不要超過兩個,這樣會讓你更容易測試這個函數(shù),如果超過 2 個參數(shù)會導致組合膨脹,以至于你必須根據(jù)不同的參數(shù)對大量不同的情況進行測試。理想情況下是兩個,如果參數(shù)過多可以使用對象來處理。

// bad
function fn(a,b,c,d) {
	// todo
}

// good
const params = {
  a: 1,
  b: 2,
  c: 3,
  d: true
}
function fn(params) {
	// todo
}

不要使用函數(shù)的內(nèi)部的參數(shù) arguments 來獲取函數(shù)的不定參數(shù),使用 ... 來接收。因為 arguments 獲取的參數(shù)是一個類數(shù)組需要轉(zhuǎn)化為真正的數(shù)組。

function foo() {
  const args = [].slice.call(arguments);
  console.log(args)
}
foo(1,2,3);	// [1,2,3]

function foo(...args) {
  console.log(args)
}
foo(1,2,3);	// [1,2,3]

當函數(shù)的參數(shù)有默認值時,可以使用最短路徑的方法設(shè)置。

// bad
function foo(a, b) {
  a = a || 1;
  b = b || 2;
}

// good
function foo(a=1, b=2) {
  // todo
}

3.3 一個函數(shù)只做一件事

一個函數(shù)最好只做一件事,這是軟件工程中最重要的原則。如果函數(shù)做了較多的事情,它就難以組合、測試和推測。當你讓函數(shù)只做一件事情的時候,它們就很容易重構(gòu),而且代碼讀起來也會清晰得多。

// bad
function foo(params) {
  params.forEach(param => {
    let param1 = fun1(param);
    if (param1.isActive) {
      email(client);
    }
  });
}

// good
function foo(params) {
  params.forEach(param => {
    step1(param)
  });
}
function step1(param) {
  if (foo2(param)) {
    email(client);
  }
}
function step2(param) {
  return fun1(param).isActive
}

上文中我們提到了在定義變量時要有意義,從命名就可以知道表達什么意思,所以在定義函數(shù)名時要有意義。

// bad
function foo() {}

// good
function setTitle() {}

3. 小結(jié)

本節(jié)我們從幾個方向入手通過好的寫法與不好的寫法進行對比,可以窺探到程序的優(yōu)雅,多使用好的規(guī)范的寫法養(yǎng)成代碼規(guī)范的好習慣。