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

語言: CN / TW / HK

theme: smartblue

本篇參考:http://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 日更文 ✍ 關注我,陪你一起度過漫長編程歲月 🌏