1. 程式人生 > 實用技巧 >JS作用域(一):一般變數宣告

JS作用域(一):一般變數宣告

變數宣告是一門程式語言的重要組成部分 ,每門程式語言都有其宣告變數的形式,今天來簡單瞭解一下JS的變數宣告方式。

與C語言的區別

在C語言中,如果我們需要使用一個變數,必須在使用前宣告它,否則程式就會報錯,同時我們也必須指定變數的型別,如int,float,char等等,因此根據這種特性,C語言也被劃歸於強型別語言。與此相反,弱型別語言的概念也應運而生,而JS便是其一。在JS中,我們使用變數前可以使用變數宣告,方式有var,let和const(注意,在JS中使用變數前並不一定需要宣告,後面會在另外的篇幅中介紹這種情況),同時,JS並不要求你指定變數的型別,並且如果你是用了var或者let去宣告變數,那麼變數的型別在程式執行過程中是隨時可以改變的。這也是弱型別語言的一個特色,就是變數的使用十分的多變和靈活。

簡單說幾個例子

var a  = 20  //聲明瞭一個變數a,它的值為20
let b = 'abc' //聲明瞭一個字串b,他的值為'abc'
const d = 30 //聲明瞭變數d,值為30

var,let和const的具體區別在這一節中不會具體細說,因為其中涉及大量作用域的知識,在介紹完JS作用域的相關知識後會再進行詳解。

一點點思考

前面說到JS是弱型別語言,這使得JS具有了很強的靈活性,一定程度上也減少了程式設計師的心智負擔,但弱型別語言並非十全十美,在許多大型專案中,弱型別的特性給程式設計師帶來的困擾遠比便捷多。

變數型別頻繁變更容易導致BUG

試想一下,一個變數a,開始他是一個Number型別,然後變成了字串型別,如果後面a參與了某些運算,而如果你並沒有準確瞭解此時變數a的具體型別,那麼你的運算就可能會得到一些十分意外的結果(博主就曾深受其害),這時候你還得回頭一行行檢視程式碼,找出在哪改變了變數的型別。(注意,JS中不同型別的變數進行邏輯運算很多情況下不會發生報錯,但卻因為這樣產生了無數BUG)。然鵝程式設計師是很聰明的,為了解決這個難題,註明的TS(TypeScript)誕生了,他很好的明確了變數的型別,而很多IDE根據這個特性給程式設計師提供了查詢變數型別的便捷方法,使得專案的開發難度和可維護性大大降低了。

弱型別語言在底層限制了JS的效能

很多強型別語言最後都編譯成了二進位制程式碼,而二進位制程式碼是電腦可以直接執行的,自然效能也最佳。然而因為JS的變數型別是不確定的,因而在轉化成二進位制程式碼以前,編譯器必須對變數型別進行判斷,所以JS並不能直接編譯成二進位制程式碼執行,而是要根據實際情況確定變數型別以後才進行編譯工作,這就損失了很大一部分效能。對此,Chorome的V8引擎以及近年的Wasm(WebAssembly)標準都試圖去解決JS的效能問題,但即便他們花費了很多功夫,目前JS相對於傳統C語言等強型別語言的效能還是有較大差距。而Chrome甚至一度想用Dart語言來替代JS進行前端開發,不過他們低估了業界對JS的鐘愛,因而後來不得不放棄了這種想法。也許在未來,JS的效能會更接近C,不過,永遠也不可能超越C,甚至等於C。