- JavaScript全棧開發(fā)
- 凌杰
- 1473字
- 2021-06-15 18:39:08
1.2 JavaScript的組成與特性
1.2.1 組成結(jié)構(gòu)
如前所述,JavaScript最初只是一門依附于Web瀏覽器的腳本語(yǔ)言,正是由于Node.js運(yùn)行環(huán)境的出現(xiàn),它才發(fā)展成了如今這樣一門橫跨Web開發(fā)領(lǐng)域的前后端、移動(dòng)設(shè)備端以及桌面應(yīng)用端的全能型編程語(yǔ)言。所以,在討論JavaScript這門語(yǔ)言的時(shí)候,讀者必須要了解該語(yǔ)言除了被ECMAScript標(biāo)準(zhǔn)所定義的核心部分,還有其所在的具體運(yùn)行環(huán)境。
例如,當(dāng)我們討論基于Web瀏覽器的JavaScript的時(shí)候,就應(yīng)該知道這時(shí)候的討論內(nèi)容除了ECMAScript標(biāo)準(zhǔn)所規(guī)定的語(yǔ)法和基本對(duì)象,通常還會(huì)涉及用于處理Web頁(yè)面內(nèi)容的文檔對(duì)象模型(Document Object Model,DOM)和用于處理Web瀏覽器事務(wù)的瀏覽器對(duì)象模型(Brower Object Model,BOM)。但在Node.js運(yùn)行環(huán)境中,DOM和BOM就不存在了,這時(shí)候就要專注于Node.js所提供的核心模塊,以及各種特定用途的第三方模塊了。
總而言之,JavaScript這個(gè)術(shù)語(yǔ)所代表的不僅是ECMAScript標(biāo)準(zhǔn)所規(guī)范的一門腳本語(yǔ)言,還涉及這門語(yǔ)言所在的運(yùn)行環(huán)境。在之后學(xué)習(xí)JavaScript的過(guò)程中,我們會(huì)越來(lái)越意識(shí)到這一點(diǎn)的重要性。這種意識(shí)將有助于理解JavaScript在Web應(yīng)用的前后端開發(fā)中扮演的不同角色,而不至于產(chǎn)生混淆。
1.2.2 語(yǔ)言特性
當(dāng)然,這里所說(shuō)的“全能型編程語(yǔ)言”僅僅指JavaScript適用的領(lǐng)域很廣泛,并不是說(shuō)可以用這門語(yǔ)言來(lái)解決所有的編程問(wèn)題。JavaScript自誕生以來(lái)一以貫之的設(shè)計(jì)理念讓它具備了一些與眾不同的特性,這些特性基本上決定了它的編程思想以及專長(zhǎng)的領(lǐng)域。下面是JavaScript的特性介紹。
- 動(dòng)態(tài)化類型。和大多數(shù)動(dòng)態(tài)腳本語(yǔ)言一樣,JavaScript中的數(shù)據(jù)類型是直接取決于變量中的“值”的,變量本身沒有數(shù)據(jù)類型上的約束,這也一直是動(dòng)態(tài)腳本語(yǔ)言與編譯型語(yǔ)言最大的區(qū)別之一。也就是說(shuō),JavaScript中的同一個(gè)變量可以存儲(chǔ)不同類型的值。例如,如果我們?cè)贘avaScript代碼中定義了一個(gè)名為
x
的變量,那么x
的初始值可以為數(shù)字,然后在執(zhí)行過(guò)程中被重新賦值為字符串,JavaScript的運(yùn)行環(huán)境會(huì)負(fù)責(zé)自動(dòng)識(shí)別該變量中存儲(chǔ)了什么類型的數(shù)據(jù)。 - 多范式編程。JavaScript雖然在語(yǔ)法上與Java、C/C++非常類似(例如
if-else
、switch
條件語(yǔ)句,while
、for
循環(huán)語(yǔ)句等),但在內(nèi)在的設(shè)計(jì)上,它更接近Self和Scheme這一類語(yǔ)言。也就是說(shuō),它既支持面向?qū)ο缶幊蹋仓С种噶钍骄幊毯秃瘮?shù)式編程,因而具有極為靈活的表達(dá)能力。 - 單線程執(zhí)行。由于最初脫胎于Web瀏覽器,JavaScript一直習(xí)慣采用單線程的執(zhí)行模式(盡管如今有了支持多線程的Worker組件),這一習(xí)慣即使到了Node.js運(yùn)行環(huán)境中也沒變。采用單線程的最大好處是不用像多線程編程那樣處理很容易產(chǎn)生bug的同步問(wèn)題,這就從根本上避免了死鎖問(wèn)題,也避免了線程上下文交換所帶來(lái)的性能上的開銷。當(dāng)然,單線程的執(zhí)行方式也有它自身的弱點(diǎn)。例如,它無(wú)法充分發(fā)揮多核處理器的性能、一個(gè)錯(cuò)誤就會(huì)導(dǎo)致整個(gè)程序崩潰,以及執(zhí)行大量計(jì)算時(shí)會(huì)因長(zhǎng)期占用處理器而影響其他異步I/O的執(zhí)行。
- 事件驅(qū)動(dòng)。在Web開發(fā)領(lǐng)域,JavaScript之所以能在瀏覽器端扮演越來(lái)越重要的角色,很大程度上得益于其具有與桌面應(yīng)用相似的事件驅(qū)動(dòng)模型。當(dāng)然,這種編程模型雖然具有輕量級(jí)、松耦合等優(yōu)勢(shì),但在多個(gè)異步任務(wù)的場(chǎng)景下,由于程序中的各個(gè)事件是彼此獨(dú)立的,因此它們之間的協(xié)作就成了一個(gè)需要費(fèi)心解決的問(wèn)題。
- 異步編程。在目前流行的Vue、React等JavaScript前端框架以及Node.js運(yùn)行環(huán)境提供的接口中,我們可以很容易地觀察到其大部分操作都是以異步調(diào)用的方式進(jìn)行的,而這些異步調(diào)用往往以回調(diào)函數(shù)的形式存在,這成了使用JavaScript編程的一大特色。不過(guò),雖然大家都認(rèn)為回調(diào)函數(shù)是執(zhí)行異步調(diào)用并接收其返回?cái)?shù)據(jù)的最佳方式,但這種方式會(huì)導(dǎo)致代碼的編寫順序與其具體執(zhí)行順序不一致。對(duì)于很多習(xí)慣同步編程方式的人來(lái)說(shuō),閱讀這樣的代碼會(huì)是一個(gè)不小的挑戰(zhàn)。另外在流程控制方面,由于程序中穿插了各種異步方法和回調(diào)函數(shù),因此代碼在可讀性上也遠(yuǎn)沒有常規(guī)的同步方式那么一目了然,這也會(huì)給程序的調(diào)試和維護(hù)工作帶來(lái)一定的麻煩。
- HTML5+CSS3王者歸來(lái)
- Java Web開發(fā)學(xué)習(xí)手冊(cè)
- Python快樂編程:人工智能深度學(xué)習(xí)基礎(chǔ)
- AngularJS Testing Cookbook
- C語(yǔ)言程序設(shè)計(jì)習(xí)題解析與上機(jī)指導(dǎo)(第4版)
- MySQL數(shù)據(jù)庫(kù)應(yīng)用與管理 第2版
- Windows系統(tǒng)管理與服務(wù)配置
- 零基礎(chǔ)趣學(xué)C語(yǔ)言
- Python深度學(xué)習(xí)原理、算法與案例
- Test-Driven Development with Django
- Julia High Performance(Second Edition)
- Mastering Leap Motion
- Clojure Data Structures and Algorithms Cookbook
- Python Penetration Testing Essentials
- Python程序員面試算法寶典