做一個好前端必須要知道的事——JS語言
程式語言按各種方法可以分為各種型別,現在讓我們來看看JS屬於什麼型別語言
解釋型語言
按編譯執行過程,可以分為編譯型語言和解釋型語言。比如
c 語言,必須先經過編譯生成目標檔案,然後連結各個目標檔案和庫檔案,生成可執行檔案。
Java、scala 則是先編譯成位元組碼,然後解釋執行位元組碼(可以理解為編譯型語言也可以理解為解釋型語言)。準確的理解,java 是編譯型語言,原始碼整個編譯成位元組碼,java 位元組碼,是解釋型語言。
Python 是解釋型語言,不過也可以先進行編譯,編譯成 python 的位元組碼。
Javascript 是解釋型語言。目前貌似還沒有直接將 js 整個編譯然後才執行(有說法是 js 動態性太強,先整體編譯難度太大,執行效能不如解釋執行高)。
⚠️注意:解釋型語言也是需要編譯的。區分編譯型語言和解釋型語言,是看原始碼是否整個編譯成目的碼然後執行還是編譯一段執行一段。
對於傳統編譯型語言來說,編譯步驟分為:詞法分析、語法分析、語義檢查、程式碼優化和位元組生成。
但對於解釋型語言來說,通過詞法分析和語法分析得到語法樹後,就可以開始解釋執行了(根據語法樹和符號表生成機器碼)。
這也就解釋了為什麼都說 js 是解釋執行的,讀一句執行一句,但是實際上 js 中還沒執行到的程式碼語法錯誤導致整個 js 不會執行的問題。例如:
console.log('不會被console出來');
= // 這裡的語法錯誤導致了上面的程式碼也不會執行
其實js變數提升的現象也很明顯的證明了js是先編譯而後執行的
在瀏覽器中,多個標籤中的 js 程式碼,是分段編譯的(所以,某一個標籤中的語法錯誤不會導致另一箇中的程式碼不執行)但是全域性物件是共享的。
動態語言
按語言按變數的型別在編譯時確定還是執行時確定可以分為靜態語言和動態語言。比如
java,String s = null;變數 s 的型別在編譯時就可以確定為字串型別。
python,變數不需要宣告,變數的型別在第一次賦值時由值的型別確定。
js,let val;let = ‘1’;變數 val 在執行 val=’1’時才能確定為字串型別。
弱型別語言
按變數的型別是否在執行時可以改變分為強型別語言和弱型別語言。比如
Java、scala 是強型別語言,變數一旦宣告,它的型別以後不能被改變。
Python 是強型別語言。
Js 是弱型別語言。比如let v = ‘1’;v=1;v=true;這在 js 中是合法的。
非常靈活的語言
按語言正規化可以分為宣告式、命令式、函式式語言。
宣告式程式設計,告訴計算機我要做什麼,而不是如何做。在更高層面寫程式碼,更關心的是目標,而不是底層演算法實現的過程。例如 css, 正規表示式,sql 語句,html, xml…
指令式程式設計,告訴計算機如何做,而不管我想要做什麼。解決某一問題的具體演算法實現。例如 java、c。
函數語言程式設計,將計算機運算看做是數學中函式的計算,並且避免了狀態以及變數的概念。
很多語言並不是單純的支援某一種正規化,像 java8 也新增了部分對函式式的支援。
js 是一個非常靈活的語言,支援命令式和函數語言程式設計。
各種型別語言的優缺點
一般編譯型語言效能比解釋型語言高。但是由於編譯型語言需要先進行編譯。
解釋型語言的好處是,部署到線上的是原始碼,可以直接修改線上環境的程式碼,解決一些 bug。比如我們有時候直接修改線上的 js 程式碼。
編譯型語言通常會用 xml 做配置檔案,因為我們通常不會改編譯後的位元組碼。解釋型語言的配置,直接寫在原始碼裡更方便,用 xml 做配置就顯得多餘。
靜態語言,有利於編譯時檢查。比如 java、在 ide 中為物件的一個不存在的屬性賦值能在編譯時檢查出錯誤。
Js 是動態語言。物件的某個屬性是否存在,在編譯時無法確定。這導致某些錯誤要到執行時才可能發現。所以一般js 程式的正確性,更需要單元測試保證。
強型別語言由於型別在宣告之後不允許改變,所以能實現編譯時型別檢查。動態語言和弱型別語言,則更靈活,實現相同功能的程式碼量通常更少或者更容易實現複雜功能。當然可讀性可維護性方面不如靜態語言和強型別語言。
最後:“相信有很多想學前端的小夥伴,今年年初我花了一個月整理了一份最適合2018年學習的web前端乾貨,從最基礎的HTML+CSS+JS到移動端HTML5等都有整理,送給每一位前端小夥伴,53763,1707這裡是小白聚集地,歡迎初學和進階中的小夥伴。”
祝大家早日學有所成,拿到滿意offer,快速升職加薪,走上人生巔峰。
相關文章
- 你必須要知道的babel二三事Babel
- Bob大叔的忠告做一個專業軟體開發者必須精通的事項
- 為什麼學習web前端開發,必須要掌握好JavaScript這門程式語言?Web前端JavaScript
- 檔案管理,你必須要知道的三個要點
- 開發一個 Web App 必須瞭解的那些事WebAPP
- 關於時序資料庫,你必須要知道的那些事兒!資料庫
- NDK之旅必須要知道的一些基本知識
- C陷阱和缺陷,必須知道的495個C語言問題C語言
- 程式設計師:難做但又必須做的 9 件頭疼事程式設計師
- C語言必須掌握的判斷題 | 4C語言
- C語言必須掌握的判斷題 | 10C語言
- 寫chrome外掛前必須要知道的Chrome
- 面試前必須要知道的Redis面試題Redis面試題
- 你必須要知道的HTTP協議原理HTTP協議
- 關於ES模組你必須要知道的一些禁忌(一)
- 入門node.js你必須知道的那些事Node.js
- 一腔熱血做遊戲——遊戲程式設計師必須瞭解的事遊戲程式設計師
- C語言必須要記住的經典程式C語言
- C語言初學者必須掌握的關鍵字!C語言
- 關於Http協議,你必須要知道的HTTP協議
- C 語言的標頭檔案是必須的嗎
- 做 Web 應用要知道的那些事Web
- Day3 你必須要知道的drf最佳實踐的十件事
- 學習 Java 語言,你必須知道的 Java 簡史Java
- 技術主管必須做的事情
- oracle必須注意事務Oracle
- 面試前必須要知道的21道Redis面試題Redis面試題
- 在面試前必須要知道的 Redis 面試內容面試Redis
- Java中處理異常的9個最佳實踐,你必須要知道!Java
- Web開發者和設計師必須要知道的 iOS 8 十個變化WebiOS
- 讓一個網站從上線到有排名,必須做的十四件事.網站
- 一個Go語言程式設計的好選題Go程式設計
- 作為一個程式開發者在職場中必須注意的7件事
- 掌握這20個JS技巧,做一個不加班的前端人JS前端
- 精選 | 你必須懂的R語言最新資料包R語言
- 未來兩年你必須掌握的五種程式語言
- 前端必須掌握的知識點前端
- 前端必須知道的除錯工具前端除錯