App下載

想在JavaScript更進(jìn)一步,你需要掌握這 36 個(gè)概念

猿友 2020-08-06 17:46:01 瀏覽數(shù) (2443)
反饋

你可能會(huì)經(jīng)常聽(tīng)到一些人在抱怨 JS 很奇怪,有時(shí)甚至是一文不值。之所以有這種想法,是因?yàn)樗麄儾惶私?JS 背后的運(yùn)作方式。我也覺(jué)得 JS 在某些情況處理方式與其它語(yǔ)言不太一樣,但這并不能怪它,它也只是以自己的方式展現(xiàn)給大家而已。

如果,你熱愛(ài)一門編程語(yǔ)言,那么應(yīng)該就會(huì)想深入了解并逐個(gè)掌握它的概念。

這里列出了36個(gè)JavaScript概念,你需要掌握這些概念才能成為一個(gè)更懂 JS 的前端開(kāi)發(fā)者。

1.調(diào)用堆棧執(zhí)行

我們都知道堆棧溢出,但是你知道堆棧溢出是由什么原因?qū)е碌膯? 堆棧溢出是與調(diào)用堆棧一些操作錯(cuò)誤相關(guān)聯(lián)的。

理解了調(diào)用堆棧,你就會(huì)清楚解像是JS 這們的編程語(yǔ)言是如何執(zhí)行的。

2. 原始數(shù)據(jù)類型

const foo = "bar";
foo.length; // 3
foo === "bar"; // true

這里,我們將值bar分配給常量foo時(shí),它屬于原始類型string。這個(gè)每個(gè)人都知道。但是各位少俠想沒(méi)想過(guò)一個(gè)問(wèn)題,string是基本數(shù)據(jù)類型,怎么能調(diào)用方法了?

奇怪嗎? 不。

這個(gè)特性稱為自動(dòng)裝箱。每當(dāng)讀取一個(gè)基本類型的時(shí)候,JS 后臺(tái)就會(huì)創(chuàng)建一個(gè)對(duì)應(yīng)的基本包裝類型對(duì)象,從而讓我們能夠調(diào)用一些方法來(lái)操作這些數(shù)據(jù)。

還是拿上面的例子開(kāi)始:

const foo = "bar";
foo.length; // 3
foo === "bar"; // true

變量 foo 是一個(gè)基本類型值,它不是對(duì)象,它不應(yīng)該有方法。但是 JS 內(nèi)部為我們完成了一系列處理(即裝箱),使得它能夠調(diào)用方法,實(shí)現(xiàn)的機(jī)制如下:

  • 創(chuàng)建String類型的一個(gè)實(shí)例
  • 在實(shí)例上調(diào)用指定的方法
  • 銷毀這個(gè)實(shí)例

const foo  = new String("bar");
foo.length
foo === 'bar'
foo = null

通過(guò)對(duì)原始數(shù)據(jù)類型有深入的了解,我們就應(yīng)該知道這些“怪異”情況是如何發(fā)生的,以及它們背后的邏輯原因。

3.值類型和引用類型

最近,我對(duì) "引用傳遞" 在 JS 是怎么工作的感到困惑。盡管我知道 CJava 等語(yǔ)言中有“按引用傳遞”和“按值傳遞”的概念,但是我不確定它在 JS 中如何工作。

你是否知道分配給 JS 中非原始值的變量對(duì)該值的引用?引用指向存儲(chǔ)值的內(nèi)存位置。。

var arr1 = [1,2,3];
var arr2 = arr1;
arr2.push(10);
console.log(arr2);
//[1, 2, 3, 10]
console.log(arr1);
//[1, 2, 3, 10]

上面的示例中可以看到,對(duì)arr2所做的任何修改也將體現(xiàn)在arr1上。這是因?yàn)樗鼈儍H保存值對(duì)應(yīng)的內(nèi)存地址的引用,而非值本身。

通過(guò)了解值類型和引用類型的概念,你就會(huì)更好地了解如何為變量分配值和內(nèi)存引用。

4. 強(qiáng)制類型轉(zhuǎn)換

這個(gè)概念主要解釋了隱式和顯式類型強(qiáng)制之間的區(qū)別。這是前端開(kāi)發(fā)中對(duì) JS 迷惑少數(shù)幾個(gè)領(lǐng)域之一。對(duì)于隱式強(qiáng)制轉(zhuǎn)換的概念尤其如此,因?yàn)樗鼘?duì)不同的數(shù)據(jù)類型以不同的方式表現(xiàn)。

這是 JS 面試中最常被考的。

Number('789')   // 顯式
+'789'          // 隱式
789 != '456'    // 隱式
9 > '5'         // 隱式
10/null          // 隱式
true | 0        // 隱式

掌握了類型顯隱轉(zhuǎn)換,恭喜你對(duì) JS 了解就進(jìn)一步了。

5. 比較運(yùn)算符號(hào) 和 typeof 運(yùn)算符

雙等與三等,它們?cè)诖蠖鄶?shù)情況下在表面上看起來(lái)相同并且給出相同的結(jié)果,但是,它們有時(shí)候可能會(huì)給帶來(lái)意想不到的錯(cuò)誤。

為了了解這兩親兄弟的區(qū)別,我們可以借助 typeof 來(lái)查看被比較的值的類型。

typeof 3 // "number"
typeof "abc" // "string"
typeof {} // "object"
typeof true // "boolean"
typeof undefined // "undefined"
typeof function(){} // "function"
typeof [] // "object"
typeof null // "object"

6. JavaScript 作用域

作用域是 JS 中一個(gè)很重要的尷尬,JS 也一直在不斷完善自己的作用域。根據(jù)Wissam的說(shuō)法,作用域的簡(jiǎn)單定義是,編譯器在需要時(shí)查找變量和函數(shù)。

了解作用域有助于我們有效地使用JavaScript。我們還需要了解全局作用域以及塊和函數(shù)作用域,也稱為詞法作用域。JS 作用域一開(kāi)始接觸會(huì)感到很困惑,但是一旦你了解了事情的幕后原理,使用它就會(huì)非常令人興奮。

(推薦教程: JavaScript教程

7. 語(yǔ)句和聲明

JavaScript 程序是一系列可執(zhí)行語(yǔ)句的集合。所謂語(yǔ)句,就是一個(gè)可執(zhí)行的單元,通過(guò)該語(yǔ)句的執(zhí)行,從而實(shí)現(xiàn)某種功能。通常一條語(yǔ)句占一行,并以分號(hào)結(jié)束。默認(rèn)情況下,JavaScript 解釋器按照語(yǔ)句的編寫流程依次執(zhí)行。如果要改變這種默認(rèn)執(zhí)行順序,需要使用判斷、循環(huán)等流程控制語(yǔ)句。

我們應(yīng)該要知道 語(yǔ)句和聲明 的區(qū)別,這對(duì)我們?nèi)媪私?JS 是很有幫助的。

8. 立即調(diào)用的函數(shù)表達(dá)式和模塊

IIFE: Immediately Invoked Function Expression,意為立即調(diào)用的函數(shù)表達(dá)式,也就是說(shuō),聲明函數(shù)的同時(shí)立即調(diào)用這個(gè)函數(shù)。它主要用于避免污染全局作用域。后來(lái),引入了ES6模塊,為避免全局作用域的污染提供了一種標(biāo)準(zhǔn)方法,盡管有人認(rèn)為它不是IIFE的直接替代。

通過(guò)理解IIFE和模塊,你可以構(gòu)建較少由于全局空間處理不當(dāng)而導(dǎo)致的錯(cuò)誤的應(yīng)用程序。當(dāng)然,使用模塊,我們還可以做很多事情。

9.消息隊(duì)列和事件循環(huán)

正如MDN文檔所說(shuō),JavaScript 有一個(gè)基于事件循環(huán)的并發(fā)模型,事件循環(huán)負(fù)責(zé)執(zhí)行代碼、收集和處理事件以及執(zhí)行隊(duì)列中的子任務(wù)。這個(gè)模型與其它語(yǔ)言中的模型截然不同,比如 CJava。

在并發(fā)模型中,消息隊(duì)列用于處理最早的消息。只要有事件發(fā)生,便會(huì)加入消息隊(duì)列中。通過(guò)理解這些概念,你可以更好地理解JS在底層是如何工作的,以及知道你的代碼是如果運(yùn)行的。

10.時(shí)間間隔

想在 JS 有計(jì)劃的調(diào)用的函數(shù),可以使用下面兩個(gè)函數(shù):

  • setTimeout 允許我們?cè)谔囟〞r(shí)間間隔后運(yùn)行一次函數(shù)。
  • setInterval允許我們重復(fù)運(yùn)行一個(gè)函數(shù),從一個(gè)特定的時(shí)間間隔開(kāi)始,然后以該間隔連續(xù)重復(fù)。 這些與前面的消息隊(duì)列和事件處理程序的概念有些關(guān)聯(lián)。因此,通過(guò)理解時(shí)間間隔方法,我們可以理解它們是如何工作的,并在我們的用例中有效地使用它們。

11.JS 引擎

JavaScript引擎是執(zhí)行 JS 代碼的計(jì)算機(jī)程序或解釋器。JS 引擎可以用多種語(yǔ)言編寫。例如,驅(qū)動(dòng)Chrome瀏覽器的V8引擎是用 c++ 編寫的,而驅(qū)動(dòng)Firefox瀏覽器的SpiderMonkey引擎是用 Cc++ 編寫的。

要想編寫高效的代碼,你必須了解所使用的 JS 引擎。使用webview的移動(dòng)開(kāi)發(fā)人員要特別注意這一點(diǎn)。

12.按位運(yùn)算

按位運(yùn)算操作將值視為位(0和1),而不是十進(jìn)制,十六進(jìn)制或八進(jìn)制數(shù)字。按位運(yùn)算符對(duì)此類二進(jìn)制表示形式執(zhí)行其操作,但是它們返回標(biāo)準(zhǔn)JavaScript數(shù)值。

通常,很少會(huì)在代碼中使用這些操作,但是它們確實(shí)有一些用例。比如,可以使用它們來(lái)查找偶數(shù)和奇數(shù)值,顏色轉(zhuǎn)換,顏色提取等等。

通過(guò)全面了解這些按位操作,您可以很好地使用 WebGL 之類的技術(shù),因?yàn)樗S多像素操作。

13. DOM 和布局樹(shù)

我們大多數(shù)人都聽(tīng)說(shuō)過(guò)文檔對(duì)象模型(DOM),但只有少數(shù)人對(duì)此有深入的了解。你知道在瀏覽器中看到的不是DOM嗎?而是渲染樹(shù),它實(shí)際上是DOMCSSOM的組合。

通過(guò)理解DOM的工作方式、結(jié)構(gòu)以及頁(yè)面的渲染方式,我們就能夠在 JS 的幫助下動(dòng)態(tài)地操作web頁(yè)面。這對(duì)于確保我們的應(yīng)用程序具有高標(biāo)準(zhǔn)的性能尤為必要。

14.類和工廠

JavaScript 不是一種面向?qū)ο蟮恼Z(yǔ)言。但是,為了模仿OOP屬性,使用了構(gòu)造函數(shù)。根據(jù)Tania的說(shuō)法,“JavaScript中的類實(shí)際上并沒(méi)有提供其他功能,只是在原型和繼承上提供語(yǔ)法糖,因?yàn)樗鼈兲峁┝烁?jiǎn)潔,更優(yōu)雅的語(yǔ)法。由于其他編程語(yǔ)言都使用類,因此 JS 中的類語(yǔ)法使開(kāi)發(fā)人員在各種語(yǔ)言之間移動(dòng)變得更加簡(jiǎn)單?!?/p>

工廠函數(shù)是不是返回對(duì)象的類或構(gòu)造函數(shù)的函數(shù)。根據(jù)JS專家Eric Elliot的說(shuō)法,“在JavaScript中,任何函數(shù)都可以返回一個(gè)新對(duì)象。如果它不是構(gòu)造函數(shù)或類,則稱為工廠函數(shù)?!?/p>

當(dāng)開(kāi)始開(kāi)發(fā)規(guī)模更大的應(yīng)用程序時(shí),理解這兩個(gè)概念是很有必要的。

15.this 關(guān)鍵字和 apply,call及bind方法

就我個(gè)人而言,我認(rèn)為對(duì)于一個(gè)JS開(kāi)發(fā)人員來(lái)說(shuō),理解this 關(guān)鍵字是至關(guān)重要的。如果你不能正確地理解它,將來(lái)你開(kāi)發(fā)的項(xiàng)目也會(huì)經(jīng)常遇到this相關(guān)的問(wèn)題。

如果你對(duì)this關(guān)鍵字很清楚,則可以看看apply,callbind方法,這些都可以解決 this 指向引發(fā)的問(wèn)題。

16.構(gòu)造函數(shù)和 “instanceOf” 運(yùn)算符

構(gòu)造函數(shù)就像常規(guī)函數(shù)一樣。但是它們有很多差異,函數(shù)名稱以大寫字母開(kāi)頭,并且只能由new運(yùn)算符執(zhí)行。具有OOP開(kāi)發(fā)經(jīng)驗(yàn)的程序員會(huì)熟悉new關(guān)鍵字。

為了正確識(shí)別對(duì)象的類型,我們使用instanceOf運(yùn)算符。簡(jiǎn)單來(lái)說(shuō),它檢查一個(gè)對(duì)象是否是另一個(gè)對(duì)象的實(shí)例。

這才助于你理解對(duì)象如何相互繼承,繼承是通過(guò)原型實(shí)現(xiàn)的。

17.原型

這是 JS 中最令人困惑的概念之一,即使對(duì)于有十年經(jīng)驗(yàn)的人來(lái)說(shuō)也是如此。

JavaScript中的原型是在對(duì)象之間共享通用功能的機(jī)制。JavaScript中幾乎所有對(duì)象都是Object的實(shí)例。對(duì)象會(huì)從Object.prototype繼承所有屬性和方法。

簡(jiǎn)單來(lái)說(shuō),原型是 JS 對(duì)象從中繼承方法和屬性的對(duì)象。

理解了原型,你就可以構(gòu)建高效,快速的應(yīng)用程序。

(推薦微課:JavaScript微課

18. 使用 new,Object.create 和 Object.assign 創(chuàng)建對(duì)象

創(chuàng)建對(duì)象有很多方法。但是,大都會(huì)選擇Object.create方法而不是new關(guān)鍵字。這是有原因的,因?yàn)?使用Object.create方法時(shí),可以將現(xiàn)有對(duì)象用作新創(chuàng)建的對(duì)象的原型。這樣就可以重用現(xiàn)有對(duì)象的屬性和功能,有點(diǎn)像OOP中的繼承概念。

使用Object.assign方法時(shí),可以將可枚舉的自身屬性從一個(gè)或多個(gè)源對(duì)象復(fù)制到目標(biāo)對(duì)象。在這種情況下,目標(biāo)對(duì)象的原型不包含源對(duì)象的屬性。這是這兩種方法之間的主要區(qū)別。

通過(guò)了解對(duì)象創(chuàng)建的這三種方式,可以根據(jù)實(shí)際情況適當(dāng)?shù)厥褂盟鼈?,以?chuàng)建效率更高的程序。

19.map,filter, reduce 方法

當(dāng)涉及到數(shù)組操作時(shí),這三種方法非常有用。它們可以在Array原型中找到。

如果你有一個(gè)數(shù)組,并且想對(duì)每個(gè)元素做一些事情,那么您可以使用map方法。

如果你有一個(gè)數(shù)組,并且想通過(guò)某些條件來(lái)過(guò)濾一些值時(shí),則可以使用filter方法。

reduce() 方法對(duì)數(shù)組中的每個(gè)元素執(zhí)行一個(gè)由你提供的reducer函數(shù)(升序執(zhí)行),將其結(jié)果匯總為單個(gè)返回值。

典型的例子就是對(duì)數(shù)組的所有元素進(jìn)行求和:

let numbers = [1,2,3,4,5,6]
const reduced = numbers.reduce( (accumulator, currentValue) => accumulator + currentValue )
console.log(reduced)
// 21

請(qǐng)注意,上述三種方法不會(huì)更改原始數(shù)組的值。

20.純函數(shù),副作用和狀態(tài)變更

這三個(gè)概念對(duì)于 JS 開(kāi)發(fā)人員而言非常重要,狀態(tài)變更對(duì)于使用 React 的開(kāi)發(fā)人員尤其重要。

純函數(shù)指的是一個(gè)函數(shù)的返回結(jié)果只依賴于它的參數(shù),并且在執(zhí)行過(guò)程里面沒(méi)有副作用。

函數(shù)副作用是指當(dāng)調(diào)用函數(shù)時(shí),除了返回函數(shù)值之外,還對(duì)主調(diào)用函數(shù)產(chǎn)生附加的影響。副作用的函數(shù)不僅僅只是返回了一個(gè)值,而且還做了其他的事情,比如:

  • 修改了一個(gè)變量
  • 直接修改數(shù)據(jù)結(jié)構(gòu)
  • 設(shè)置一個(gè)對(duì)象的成員
  • 拋出一個(gè)異?;蛞砸粋€(gè)錯(cuò)誤終止
  • 打印到終端或讀取用戶輸入
  • 讀取或?qū)懭胍粋€(gè)文件
  • 在屏幕上畫圖

狀態(tài)變更是指你更改變量值的地方。如果你對(duì)變量進(jìn)行更改,則可能會(huì)影響到其他函數(shù),具體取決于變量被更改之前的值。在React環(huán)境中,建議我不要改變狀態(tài)。

21. 閉包

閉包很難理解。但是一旦理解,你會(huì)覺(jué)得 JS 其實(shí)也挺好的。在線上有足夠的資源。你花足夠的時(shí)間學(xué)習(xí)閉包,掌握理解它并不難。

使用閉包可以訪問(wèn)內(nèi)部作用域中外部作用域的作用域。每次創(chuàng)建函數(shù)時(shí)都會(huì)在函數(shù)創(chuàng)建時(shí)創(chuàng)建JavaScript閉包。

22. 高階函數(shù)

高階函數(shù)是將其他函數(shù)作為參數(shù)或返回結(jié)果的函數(shù)。你可以創(chuàng)建僅負(fù)責(zé)一項(xiàng)任務(wù)的較小函數(shù),然后在這些較小函數(shù)的幫助下構(gòu)造復(fù)雜函數(shù)。這也會(huì)提交代碼的可重用性。

23.遞歸

遞歸是所有編程語(yǔ)言中的一個(gè)常見(jiàn)概念。簡(jiǎn)單地說(shuō),遞歸就是把大問(wèn)題分解成小問(wèn)題,然后解決小問(wèn)題一種思路。

盡管遞歸可能是一個(gè)讓你頭疼的令人困惑的概念,但是通過(guò)大量的練習(xí),從一些小問(wèn)題開(kāi)始,你可以更好地理解它。

24.集合與生成器

ES6 中新引入了集合和生成器。新引入的集合有Map,Set,WeakSet和WeakMap。這些集合為我們提供一些很方便的操作。了解它們的方式至關(guān)重要,尤其是對(duì)于現(xiàn)代JavaScript。

生成器有時(shí)很難理解,特別是對(duì)于初學(xué)者。生成器允許我們編寫代碼函數(shù),從而能夠暫停和重新啟動(dòng)函數(shù),而不會(huì)阻止其他代碼的執(zhí)行,這在JavaScript中是很不常見(jiàn)的。

25. Promise

Jecelyn對(duì) Promises 的解釋如下:“想象一下你是個(gè)孩子。你媽媽向你保證,她下周會(huì)買一部新手機(jī)給你?!?/p>

你要到下周才能知道你是否能屋那部手機(jī)。你的媽媽要么真的給你買了一個(gè)全新的手機(jī),要么因?yàn)椴婚_(kāi)心就不給你買。

這算是一個(gè)承諾。一個(gè) Promise 有三個(gè)狀態(tài),分別是:

  1. Pending:你不知道你是否會(huì)能得到那個(gè)電話
  2. Fulfilled:媽媽高興了,給你買了一部新手機(jī)
  3. Rejected:老媽不開(kāi)心了,就是不給買,愛(ài)咋滴就咋滳

26.異步編程

要了解什么是異步編程,首先要先積善成德什么是同步編程。同步編程是線程阻塞的,由于 JS 是單線程的,因此代碼將逐行執(zhí)行。

但是使用異步代碼,你可以執(zhí)行一些比較耗時(shí)的任務(wù)。當(dāng)你必須執(zhí)行花費(fèi)很長(zhǎng)時(shí)間才能完成的多個(gè)任務(wù)時(shí),此功能特別有用。但是在某些情況下,即使是需要執(zhí)行很長(zhǎng)時(shí)間的代碼,也可能需要用同步的方式,這時(shí)就可以使用async/await

27. ES6 箭頭函數(shù)

箭頭函數(shù)是 ES6 的新增功能,是常規(guī)函數(shù)的語(yǔ)法替代。區(qū)別在于箭頭函數(shù)不綁定到this,arguments,supernew.target關(guān)鍵字。這使得箭頭函數(shù)在某些情況下是一個(gè)不錯(cuò)的選擇,而在另一些情況下則是一個(gè)非常糟糕的選擇。

因此,不要一上來(lái)就使用箭頭函數(shù)。需要根據(jù)你實(shí)際情況還使用它們。

28. 數(shù)據(jù)結(jié)構(gòu)

無(wú)論使用哪種編程語(yǔ)言,數(shù)據(jù)結(jié)構(gòu)都是開(kāi)發(fā)人員應(yīng)具備的基本知識(shí)之一。

糟糕的程序員擔(dān)心代碼,好的程序員擔(dān)心數(shù)據(jù)結(jié)構(gòu)和它們之間的關(guān)系。

數(shù)據(jù)結(jié)構(gòu)方面,你應(yīng)該了解鏈表,隊(duì)列,堆棧,樹(shù),圖和哈希表。

29.時(shí)間復(fù)雜度

不管編程語(yǔ)言如何,時(shí)間復(fù)雜度分析也是計(jì)算機(jī)編程的另一個(gè)基礎(chǔ)。為了構(gòu)建更好的應(yīng)用程序,你應(yīng)該編寫更好的解決方案。為此,你需要了解時(shí)間復(fù)雜度的概念。有時(shí)也稱為BigO。

30.算法

這也是在計(jì)算機(jī)基礎(chǔ)課程中首先要教的內(nèi)容之一。簡(jiǎn)而言之,算法是逐步實(shí)現(xiàn)目標(biāo)的過(guò)程。程序員應(yīng)該能夠從算法的角度看任何問(wèn)題。

盡管有成千上萬(wàn)個(gè)用例的大量算法,但是下面兩個(gè)很常見(jiàn):

  • 查找
  • 排序

這兩個(gè)用例對(duì)程序員來(lái)說(shuō)是非常常見(jiàn)的,至少應(yīng)該了解實(shí)現(xiàn)它們的已知算法。沒(méi)有固定的規(guī)則規(guī)定你應(yīng)該使用這些算法之一,但是這些算法在性能方面是眾所周知的,并且有很好的文檔證明。

你甚至可以創(chuàng)建自己的算法,并將其介紹給世界。如果它比目前已知的算法更好,你可能會(huì)成為下一個(gè)編程明星。

31.繼承,多態(tài)和代碼重用

JS 中的繼承可用于原型來(lái)實(shí)現(xiàn)。這是因?yàn)?JS 是非OOP語(yǔ)言。但是 JS 通過(guò)提供原型繼承來(lái)提供OOP的某些功能。

多態(tài)是對(duì)象、變量或函數(shù)可以采用多種形式的概念。在 JS 中,要看到多態(tài)的效果有點(diǎn)困難,因?yàn)樵陟o態(tài)類型的系統(tǒng)中,多態(tài)的經(jīng)典類型更明顯。

以上兩個(gè)概念都可以幫助我們?cè)?JS 中實(shí)現(xiàn)更好代碼重用。

32.設(shè)計(jì)模式

設(shè)計(jì)模式(Design pattern)代表了最佳的實(shí)踐,通常被有經(jīng)驗(yàn)的面向?qū)ο蟮能浖_(kāi)發(fā)人員所采用。設(shè)計(jì)模式是軟件開(kāi)發(fā)人員在軟件開(kāi)發(fā)過(guò)程中面臨的一般問(wèn)題的解決方案。這些解決方案是眾多軟件開(kāi)發(fā)人員經(jīng)過(guò)相當(dāng)長(zhǎng)的一段時(shí)間的試驗(yàn)和錯(cuò)誤總結(jié)出來(lái)的。

33. 函數(shù)式編程

函數(shù)式編程是一種編程范式,是一種構(gòu)建計(jì)算機(jī)程序結(jié)構(gòu)和元素的風(fēng)格,它把計(jì)算看作是對(duì)數(shù)學(xué)函數(shù)的評(píng)估,避免了狀態(tài)的變化和數(shù)據(jù)的可變。

你需要掌握函數(shù)式編程的幾個(gè)概念:

  • 純函數(shù)
  • 不可變
  • 引用透明性
  • 高階函數(shù)

34. 簡(jiǎn)潔代碼的原則

無(wú)論使用哪種編程語(yǔ)言,這都是每個(gè)開(kāi)發(fā)人員都應(yīng)該掌握的一項(xiàng)基本技能。每種編程語(yǔ)言都有一套單獨(dú)的良好實(shí)踐。盡管這些“良好”做法是主觀的,并且在工作場(chǎng)所之間存在差異,但有些慣例被認(rèn)為是“良好”。

通過(guò)遵循這些代碼原則,可以確保每個(gè)人都可以閱讀和維護(hù)你的代碼。這也會(huì)幫助你和你的團(tuán)隊(duì)在應(yīng)用程序開(kāi)發(fā)過(guò)程中順利合作。

35. 解構(gòu)賦值

ES6中引入了解構(gòu)賦值操作符,它非常有用。對(duì)于相同的用例,它們比以前的實(shí)現(xiàn)更簡(jiǎn)單、更有效。

36. ES2020新特性

編程的優(yōu)點(diǎn)之一是,如果你不去不斷學(xué)習(xí),你永遠(yuǎn)不會(huì)成為該領(lǐng)域?qū)<摇>幊陶Z(yǔ)言會(huì)隨著時(shí)間不斷發(fā)展,因?yàn)槊總€(gè)主要版本中都引入了其他新的功能。

這也說(shuō)明了你對(duì)某個(gè)概念的專業(yè)知識(shí)很可能在將來(lái)的10年后會(huì)過(guò)期,因?yàn)闀?huì)有更好的替代版本與版本更新一起發(fā)布。對(duì)于任何編程語(yǔ)言,這都是非常常見(jiàn)的情況。

ES2020發(fā)布了幾個(gè)新特性,包括可選鏈接、空值合并、動(dòng)態(tài)導(dǎo)入等等。你必須學(xué)習(xí)這些新概念,以跟上快速變化的It世界。

掌握一門語(yǔ)言需要多年的經(jīng)驗(yàn)和時(shí)間,但是知道要掌握什么會(huì)讓事情變得更容易,希望這36個(gè)概念能對(duì)你有所幫助。

文章來(lái)源:medium.com/better-programming/36-javascript-concepts-you-need-to-master-to-become-an-expert-c6630ac41bf4

0 人點(diǎn)贊