首頁(yè)技術(shù)文章正文

Web前端開(kāi)發(fā)培訓(xùn)之全面的前端開(kāi)發(fā)指南:JavaScript

更新時(shí)間:2017-06-21 來(lái)源:黑馬程序員web前端開(kāi)發(fā)培訓(xùn)學(xué)院 瀏覽量:

JavaScript性能
可讀性,正確性和可表達(dá)性優(yōu)于性能。JavaScript基本上永遠(yuǎn)不會(huì)是你的性能瓶頸。圖像壓縮,網(wǎng)絡(luò)接入和DOM重排來(lái)代替優(yōu)化。如果從本文中你只能記住一個(gè)指導(dǎo)原則,那么毫無(wú)疑問(wèn)就是這一條。
[JavaScript] 純文本查看 復(fù)制代碼
1
2
3
// bad (albeit way faster)const arr = [1, 2, 3, 4];const len = arr.length;var i = -1;var result = [];while (++i < len) {  var n = arr;  if (n % 2 > 0) continue;
  result.push(n * n);
}// goodconst arr = [1, 2, 3, 4];const isEven = n => n % 2 == 0;const square = n => n * n;const result = arr.filter(isEven).map(square);
無(wú)狀態(tài)
盡量保持函數(shù)純潔。理論上,所有函數(shù)都不會(huì)產(chǎn)生副作用,不會(huì)使用外部數(shù)據(jù),并且會(huì)返回新對(duì)象,而不是改變現(xiàn)有的對(duì)象。
[JavaScript] 純文本查看 復(fù)制代碼
1
2
3
4
5
// bad
const merge = (target, ...sources) => Object.assign(target, ...sources);
merge({ foo: "foo" }, { bar: "bar" }); // => { foo: "foo", bar: "bar" }// good
const merge = (...sources) => Object.assign({}, ...sources);
merge({ foo: "foo" }, { bar: "bar" }); // => { foo: "foo", bar: "bar" }
本地化
盡可能地依賴本地方法。
[JavaScript] 純文本查看 復(fù)制代碼
1
2
// badconst toArray = obj => [].slice.call(obj);// goodconst toArray = (() =>  Array.from ? Array.from : obj => [].slice.call(obj)
)();
強(qiáng)制性
如果強(qiáng)制有意義,那么就使用隱式強(qiáng)制。否則就應(yīng)該避免強(qiáng)制。
[JavaScript] 純文本查看 復(fù)制代碼
1
// badif (x === undefined || x === null) { ... }// goodif (x == undefined) { ... }
循環(huán)
不要使用循環(huán),因?yàn)樗鼈儠?huì)強(qiáng)迫你使用可變對(duì)象。依靠array.prototype 方法。
[JavaScript] 純文本查看 復(fù)制代碼
1
2
3
4
5
6
7
8
9
// badconst sum = arr => {  var sum = 0;  var i = -1;  for (;arr[++i];) {
    sum += arr;
  return sum;
};
sum([1, 2, 3]); // => 6// goodconst sum = arr =>
  arr.reduce((x, y) => x + y);
sum([1, 2, 3]); // => 6
如果不能避免,或使用array.prototype 方法濫用了,那就使用遞歸。
[JavaScript] 純文本查看 復(fù)制代碼
01
02
03
04
05
06
07
08
09
10
11
12
// badconst createDivs = howMany => {  while (howMany--) {
    document.body.insertAdjacentHTML("beforeend", "<div></div>");
  }
};
createDivs(5);// badconst createDivs = howMany =>
  [...Array(howMany)].forEach(() =>
    document.body.insertAdjacentHTML("beforeend", "<div></div>")
  );
createDivs(5);// goodconst createDivs = howMany => {  if (!howMany) return;
  document.body.insertAdjacentHTML("beforeend", "<div></div>");  return createDivs(howMany - 1);
};
createDivs(5);
這里有一個(gè)通用的循環(huán)功能,可以讓遞歸更容易使用。
參數(shù)
忘記arguments 對(duì)象。余下的參數(shù)往往是一個(gè)更好的選擇,這是因?yàn)椋?/span>
你可以從它的命名中更好地了解函數(shù)需要什么樣的參數(shù)
真實(shí)數(shù)組,更易于使用。
[JavaScript] 純文本查看 復(fù)制代碼
1
// badconst sortNumbers = () =>  Array.prototype.slice.call(arguments).sort();// goodconst sortNumbers = (...numbers) => numbers.sort();
應(yīng)用
忘掉apply()。使用操作符。
[JavaScript] 純文本查看 復(fù)制代碼
1
const greet = (first, last) => `Hi ${first} ${last}`;const person = ["John", "Doe"];// badgreet.apply(null, person);// goodgreet(...person);
綁定
當(dāng)有更慣用的做法時(shí),就不要用bind() 。
[JavaScript] 純文本查看 復(fù)制代碼
1
// bad["foo", "bar"].forEach(func.bind(this));// good["foo", "bar"].forEach(func, this);
[JavaScript] 純文本查看 復(fù)制代碼
01
02
03
04
05
06
07
08
09
10
11
12
// badconst person = {
  first: "John",
  last: "Doe",
  greet() {    const full = function() {      return `${this.first} ${this.last}`;
    }.bind(this);    return `Hello ${full()}`;
  }
}// goodconst person = {
  first: "John",
  last: "Doe",
  greet() {    const full = () => `${this.first} ${this.last}`;    return `Hello ${full()}`;
  }
}
函數(shù)嵌套
沒(méi)有必要的話,就不要嵌套函數(shù)。
[JavaScript] 純文本查看 復(fù)制代碼
1
// bad[1, 2, 3].map(num => String(num));// good[1, 2, 3].map(String);
合成函數(shù)
避免調(diào)用多重嵌套函數(shù)。使用合成函數(shù)來(lái)替代。
[JavaScript] 純文本查看 復(fù)制代碼
1
2
const plus1 = a => a + 1;const mult2 = a => a * 2;// badmult2(plus1(5)); // => 12// goodconst pipeline = (...funcs) => val => funcs.reduce((a, b) => b(a), val);const addThenMult = pipeline(plus1, mult2);
addThenMult(5); // => 12
緩存
緩存功能測(cè)試,大數(shù)據(jù)結(jié)構(gòu)和任何奢侈的操作。
[JavaScript] 純文本查看 復(fù)制代碼
1
2
3
4
5
6
7
8
// badconst contains = (arr, value) =>  Array.prototype.includes
    ? arr.includes(value)
    : arr.some(el => el === value);
contains(["foo", "bar"], "baz"); // => false// goodconst contains = (() =>  Array.prototype.includes
    ? (arr, value) => arr.includes(value)
    : (arr, value) => arr.some(el => el === value)
)();
contains(["foo", "bar"], "baz"); // => false
變量
const 優(yōu)于let ,let 優(yōu)于var。
[JavaScript] 純文本查看 復(fù)制代碼
1
2
3
// badvar me = new Map();
me.set("name", "Ben").set("country", "Belgium");// goodconst me = new Map();
me.set("name", "Ben").set("country", "Belgium");
條件
IIFE 和return 語(yǔ)句優(yōu)于if, else if,else和switch語(yǔ)句。
[JavaScript] 純文本查看 復(fù)制代碼
1
2
3
4
5
// badvar grade;if (result < 50)
  grade = "bad";else if (result < 90)
  grade = "good";else
  grade = "excellent";// goodconst grade = (() => {  if (result < 50)    return "bad";  if (result < 90)    return "good";  return "excellent";
})();
對(duì)象迭代
如果可以的話,避免for…in。
[JavaScript] 純文本查看 復(fù)制代碼
1
2
3
4
5
6
7
const shared = { foo: "foo" };const obj = Object.create(shared, {
  bar: {
    value: "bar",
    enumerable: true
  }
});// badfor (var prop in obj) {  if (obj.hasOwnProperty(prop))    console.log(prop);
}// goodObject.keys(obj).forEach(prop => console.log(prop));
map對(duì)象
在對(duì)象有合法用例的情況下,map通常是一個(gè)更好,更強(qiáng)大的選擇。
[JavaScript] 純文本查看 復(fù)制代碼
01
02
03
04
05
06
07
08
09
10
// badconst me = {
  name: "Ben",
  age: 30};var meSize = Object.keys(me).length;
meSize; // => 2me.country = "Belgium";
meSize++;
meSize; // => 3// goodconst me = new Map();
me.set("name", "Ben");
me.set("age", 30);
me.size; // => 2me.set("country", "Belgium");
me.size; // => 3
Curry
Curry雖然功能強(qiáng)大,但對(duì)于許多開(kāi)發(fā)人員來(lái)說(shuō)是一個(gè)外來(lái)的范式。不要濫用,因?yàn)槠湟暻闆r而定的用例相當(dāng)不尋常。
[JavaScript] 純文本查看 復(fù)制代碼
1
2
3
// badconst sum = a => b => a + b;
sum(5)(3); // => 8// goodconst sum = (a, b) => a + b;
sum(5, 3); // => 8
可讀性
不要用看似聰明的伎倆混淆代碼的意圖。
[JavaScript] 純文本查看 復(fù)制代碼
1
// badfoo || doSomething();// goodif (!foo) doSomething();
[JavaScript] 純文本查看 復(fù)制代碼
1
// badvoid function() { /* IIFE */ }();// good(function() { /* IIFE */ }());
[JavaScript] 純文本查看 復(fù)制代碼
1
// badconst n = ~~3.14;// goodconst n = Math.floor(3.14);
代碼重用
不要害怕創(chuàng)建小型的,高度可組合的,可重復(fù)使用的函數(shù)。
[JavaScript] 純文本查看 復(fù)制代碼
1
2
// badarr[arr.length - 1];// goodconst first = arr => arr[0];const last = arr => first(arr.slice(-1));
last(arr);
[JavaScript] 純文本查看 復(fù)制代碼
1
// badconst product = (a, b) => a * b;const triple = n => n * 3;// goodconst product = (a, b) => a * b;const triple = product.bind(null, 3);
依賴性
最小化依賴性。第三方是你不知道的代碼。不要只是因?yàn)閹讉€(gè)可輕易復(fù)制的方法而加載整個(gè)庫(kù):
[JavaScript] 純文本查看 復(fù)制代碼
1
2
3
4
5
6
7
8
// badvar _ = require("underscore");
_.compact(["foo", 0]));
_.unique(["foo", "foo"]);
_.union(["foo"], ["bar"], ["foo"]);// goodconst compact = arr => arr.filter(el => el);const unique = arr => [...Set(arr)];const union = (...arr) => unique([].concat(...arr));
compact(["foo", 0]);
unique(["foo", "foo"]);
union(["foo"], ["bar"], ["foo"]);
 


本文版權(quán)歸黑馬程序員web前端開(kāi)發(fā)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處,謝謝!
作者:黑馬程序員web前端培訓(xùn)學(xué)院;
首發(fā):http://web.itheima.com/ 

分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!