4 個 JavaScript 最基礎的問題 —— Eric Elliott

語言: CN / TW / HK

theme: smartblue

本篇參考:https://medium.com/javascript-scene/10-interview-questions-every-javascript-developer-should-know-6fa6bdf5ad95

作者:Eric Elliott

持續創作,加速成長!這是我參與「掘金日新計劃 · 6 月更文挑戰」的第29天,點選檢視活動詳情


咱就是說,經常看技術部落格的同學應該熟悉 Eric Elliott 這位老哥,他致力於 JavaScript 程式設計、區塊鏈領域的技術博文輸出,在 medium 平臺上有 10w+ 粉絲。

本瓜發現,對於 JS 程式設計,這老哥有以下 2 個特點:

  1. 青睞函數語言程式設計;
  2. 排斥 class 類繼承,青睞基於原型繼承;

對於技術偏好,需辯證的看待。本篇就從他原本 10 個基礎面試問題中抽取其中 4 個還不錯的問題來看看~

按需所取,沖沖衝ヾ(◍°∇°◍)ノ゙

一、你能說出 JavaScript 的程式設計正規化嗎?

好的回答

首先要說出:JavaScript 是一門多正規化語言!支援面向過程(命令式)、面向物件(OOP)和函數語言程式設計(宣告式)。

其次,最重要的是說出:JavaScript 是通過原型繼承(OLOO-物件委託)來實現面向物件(OOP)的;

如果還能說出以下,就更棒了:JavaScript 通過閉包、函式是一等公民、lambda 運算來實現函數語言程式設計的。

如果再進一步,回答出 JavaScript 演進歷史,就直接稱絕叫好了:JavaScript的語言設計主要受到了Self(一種基於原型的程式語言)和Scheme(一門函數語言程式設計語言)的影響。在語法結構上它又與C語言有很多相似。

  • Self 語言 => 基於原型 => JavaScript 用原型實現面向物件程式設計;
  • Scheme 語言 => 函數語言程式設計語言 => JavaScript 函數語言程式設計;
  • C 語言 => 面向過程 => JavaScript 面向過程程式設計;

推薦 Eric Elliott 的另外兩篇文章,JavaScript 的兩大支柱:

  1. 基於原型的繼承
  2. 函數語言程式設計

差的回答

不知道程式設計正規化是什麼、或者沒有提到通過原型實現面向物件、或者沒有提到函數語言程式設計;

二、什麼是函數語言程式設計?

好的回答

函數語言程式設計是最早出現的程式設計正規化,通過組合運算函式來生成程式。有一些重要的概念:

  • 純函式
  • 避免副作用
  • 函式組合
  • 高階函式(閉包)
  • 函式組合
  • 其它函數語言程式設計語言,比如 Lisp、Haskell

本瓜覺得這裡最 nb 就是能提到 monad 和延遲執行了~

差的回答

沒聽說過函數語言程式設計,或者沒有提到純函式、不知道副作用(隱式、顯示輸出)、更不可能知道高階函式、閉包的應用、函式封裝、函式組合這些了;

三、類繼承和原型繼承有什麼區別?

好的回答

類繼承,通過建構函式實現( new 關鍵字);tips:即使不用 ES6 class,也能實現類繼承;

原型繼承,例項直接從其他物件繼承,工廠函式或 Object.create();

本瓜這裡覺得能答出以下就很棒了:

類繼承:基於物件複製;

原型繼承:基於物件委託;

推薦閱讀:

差的回答

類繼承和原型繼承沒有什麼差別。

四、面向物件和函式式的優缺點

好的回答

面向物件優點:物件的概念容易理解,方法呼叫靈活;

面向物件缺點:物件可在多個函式中共享狀態、被修改,極有可能會產生“競爭”的情況(多處修改同一物件);

函式式優點:避免變數的共享、修改,純函式不產生副作用;宣告式程式碼風格更易閱讀,更易程式碼重組、複用;

函式式缺點:過度抽象,可讀性降低;學習難度更大,比如 Monad;

差的回答

對二者的優缺點不熟悉;

OK,以上便是本篇分享。點贊關注評論,為好文助力👍

我是掘金安東尼 🤠 100 萬閱讀量人氣前端技術博主 💥 INFP 寫作人格堅持 1000 日更文 ✍ 關注我,陪你一起度過漫長程式設計歲月 🌏