這要看你希望學(xué)什么樣的框架,并且想把框架用到什么程度。下面按門檻從低到高給你分析幾種框架:
成都創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都做網(wǎng)站、成都網(wǎng)站建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、錦屏網(wǎng)絡(luò)推廣、小程序定制開發(fā)、錦屏網(wǎng)絡(luò)營銷、錦屏企業(yè)策劃、錦屏品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;成都創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供錦屏建站搭建服務(wù),24小時(shí)服務(wù)熱線:18982081108,官方網(wǎng)址:jinyejixie.com
1、jQuery。實(shí)際上jQuery并不是真正意義上的框架,它只是一個把常用操作封裝好的一個庫。使用它很簡單,幾乎沒有什么門檻,只要懂得數(shù)據(jù)類型、選擇/循環(huán)結(jié)構(gòu)、對象這些簡單的知識即可快速上手。
2、編寫jQuery插件。你需要懂得什么是閉包、原型、函數(shù)式用法等等。要想更靈活高效地編寫出優(yōu)質(zhì)的插件代碼,你還要懂得JS面向?qū)ο蟮膶懛ǎ热缋^承。
3、MVVM框架,如VUE、REACT、ANGULAR。只有比較熟練地掌握和運(yùn)用閉包、原型、函數(shù)式等,你才看得懂它們的文檔和教程,否則會比較吃力,步步遇坑。
4、NodeJS。除了掌握上述的知識外,你還需要掌握J(rèn)S模塊化的寫法,還要掌握一些ES6的語法。
現(xiàn)在有很多各種各樣的JavaScript庫,但這里將介紹7個很優(yōu)秀的可用于你下一個JavaScript項(xiàng)目的庫。
儀表盤是用于目標(biāo)或業(yè)務(wù)流程的視覺指示工具,也用于切割雜亂無章的數(shù)據(jù),從而分割出要點(diǎn)的重要工具。
它可幫助評估信息,并及時(shí)做出正確的決定。
實(shí)時(shí)可視化的儀表盤由圖標(biāo)、測繪圖、圖形符號,以及數(shù)據(jù)表格等組成。
目前有一些開源或商業(yè)的庫用于創(chuàng)建儀表盤。
在本文中,我們將會展示一些可幫助創(chuàng)建美觀且可自定義的儀表盤的JavaScript庫。
1.Gridster.jsGridster是一個jQuery插件,可以從跨多個列的元素構(gòu)建直觀的可拖拽布局。
它可以讓你從網(wǎng)格中動態(tài)添加或刪除小部件,甚至可以獲得一個具有所有小部件位置的對象的JavaScript數(shù)組,從而可以在以后使用這些數(shù)組來加載小部件。
2.angular-gridster這是一個用于AngularJS的格子狀小部件的實(shí)現(xiàn)。
它具有jQuerygridster插件等功能,也具有一些其他的功能。
它完全使用Angular指令重寫,還可以使用Angular的數(shù)據(jù)綁定功能。
3.gridstack.jsgridstack.js是一個用于小部件布局的jQuery插件,靈感來自gridster.js。
這是一個可拖放的多列網(wǎng)格,可讓你構(gòu)建可拖拽的響應(yīng)式Bootstrapv3的友好布局,它還適用于knockout.js,angular.js和觸摸設(shè)備。
4.jQueryGridlyGridly是一個jQuery插件,電腦培訓(xùn)建議可用于拖放以及在網(wǎng)格中調(diào)整大小。
5.PackeryPackery是一個JavaScript庫和jQuery插件,可用于生成無縫且可拖拽的布局。
它使用bin-packing算法來填充空隙。
它適合用于創(chuàng)建一個可拖拽的儀表盤和無縫的“磚石圖像畫廊”布局。
JavaScript是一種屬于網(wǎng)絡(luò)的腳本語言,已經(jīng)被廣泛用于Web應(yīng)用開發(fā),常用來為網(wǎng)頁添加各式各樣的動態(tài)功能,為用戶提供更流暢美觀的瀏覽效果。通常JavaScript腳本是通過嵌入在HTML中來實(shí)現(xiàn)自身的功能的。
所以javascript要運(yùn)行在html中,直接的js文件是不能運(yùn)行的。
你需要寫個html然后加載你所寫的js文件,在瀏覽器中打開即可
JSP與JavaScript(JavaScript的縮寫就是js)之間的一些主要區(qū)別:
1、Java Server Pages是一種動態(tài)網(wǎng)頁技術(shù),而JavaScript是一種腳本語言,可以使靜態(tài)HTML內(nèi)容
成為動態(tài)。
2、Java Server Pages具有在HTML之間添加Java代碼的scriptlet,而JavaScript具有許多內(nèi)置
函數(shù),可以使用基于面向?qū)ο缶幊棠P椭谢谠湍J降睦^承的JavaScript對象來修改數(shù)據(jù)。
3、Java Server Pages具有JSTL支持以處理一些復(fù)雜的功能,而JavaScript具有不同的數(shù)據(jù)類
型,如Boolean,Number,String,Date,Math,HTML DOM和RegExp等,
4、Java Server Pages幾乎支持所有Web瀏覽器,而JavaScript不支持跨瀏覽器功能,導(dǎo)致在
瀏覽器更改期間執(zhí)行少量功能的失敗導(dǎo)致不利。
5、Java Server Pages將通過Web服務(wù)器從后端呈現(xiàn)和提供,而JavaScript是一種腳本語言,
可以在客戶端和服務(wù)器端使用,或者在瀏覽器端或客戶端使用,其中代碼將由內(nèi)部編譯。
JavaScript內(nèi)置編譯器稱為JIT編譯器,然后它將在瀏覽器中解釋,模塊的執(zhí)行稍后在客戶端環(huán)
境(即瀏覽器)上發(fā)生。
6、Java Server Pages具有JSR規(guī)范,這是Oracle的標(biāo)準(zhǔn),而JavaScript具有最新標(biāo)準(zhǔn),稱為
ES 9(ECMAScript標(biāo)準(zhǔn)),支持其編程模型中的高級功能方面和幾個高階函數(shù)。
7、Java Server Pages在開發(fā)復(fù)雜功能方面存在局限性,而JavaScript有一個標(biāo)準(zhǔn)規(guī)范,可以
使用JS強(qiáng)大的函數(shù)編程方面來操作復(fù)雜模塊。
8、Java Server Pages在Web容器中具有JSP隱式對象功能,而JavaScript具有可通過使用let
關(guān)鍵字在ES 6標(biāo)準(zhǔn)中使用的提升功能。
9、Java Server Pages支持表達(dá)式語言(EL),它提供對Java對象中的函數(shù)和數(shù)據(jù)的訪問,而
JavaScript具有隱式原型引用,用于引用JS對象中的數(shù)據(jù)。
10、Java Server Pages有JSP編譯器,它將JSP轉(zhuǎn)換為Servlet來解釋網(wǎng)頁內(nèi)容和顯示,而
JavaScript有Javascript解釋器來解析稱為Javascript引擎的代碼。
擴(kuò)展資料:
JavaScript的優(yōu)點(diǎn)
1、速度??蛻舳薐avaScript非常快,因?yàn)樗梢栽诳蛻舳藶g覽器中立即運(yùn)行。除非需要外部資
源,否則JavaScript不會受到后端服務(wù)器的網(wǎng)絡(luò)調(diào)用的阻礙。它也沒有必要在客戶端編譯,這
給了它一定的速度優(yōu)勢(授予,增加一些風(fēng)險(xiǎn)取決于所開發(fā)代碼的質(zhì)量)。
2、簡單。JavaScript的學(xué)習(xí)和實(shí)現(xiàn)相對簡單。
3、人氣。JavaScript在Web中隨處可用。學(xué)習(xí)JavaScript的資源很多。StackOverflow和
GitHub有許多使用Javascript的項(xiàng)目,并且語言作為一個整體近年來在業(yè)界獲得了很大的關(guān)
注,尤其是。
4、互操作性。JavaScript可以很好地與其他語言一起使用,并且可以在各種各樣的應(yīng)用程序中
使用。與PHP或SSI腳本不同,JavaScript可以插入任何網(wǎng)頁,無論文件擴(kuò)展名如何。
JavaScript也可以在用其他語言編寫的腳本中使用,例如Perl和PHP。
5、服務(wù)器負(fù)載??蛻舳藴p少了對網(wǎng)站服務(wù)器的需求。
6、豐富的接口。拖放組件或滑塊可為您的網(wǎng)站提供豐富的界面。
7、擴(kuò)展功能。像Greasemonkey這樣的第三方附加組件使JavaScript開發(fā)人員能夠編寫可以在
所需網(wǎng)頁上執(zhí)行以擴(kuò)展其功能的JavaScript代碼片段。
8、多功能性。如今,有許多方法可以通過Node.js服務(wù)器使用JavaScript。如果您使用
Express引導(dǎo)node.js,使用像mongodb這樣的文檔數(shù)據(jù)庫,并在前端為客戶端使用
JavaScript,則可以僅使用JavaScript從前到后開發(fā)整個JavaScript應(yīng)用程序。
新系列 深入淺出TypeScript 來了,本系列至少20+篇。本文為第一篇,來介紹一下TypeScript 以及常見的類型。
TypeScript是一門由微軟推出的開源的、跨平臺的編程語言。它是JavaScript的超集,擴(kuò)展了 JavaScript 的語法,最終會被編譯為JavaScript代碼。
TypeScript的主要特性:
TypeScript 主要是為了實(shí)現(xiàn)以下兩個目標(biāo):
下面就來看看這兩個目標(biāo)是如何實(shí)現(xiàn)的。
為什么要給JavaScript加上類型呢?
我們知道,JavaScript是一種輕量級的解釋性腳本語言。也是弱類型、動態(tài)類型語言,允許隱式轉(zhuǎn)換,只有運(yùn)行時(shí)才能確定變量的類型。正是因?yàn)樵谶\(yùn)行時(shí)才能確定變量的類型,JavaScript代碼很多錯誤在運(yùn)行時(shí)才能發(fā)現(xiàn)。TypeScript在JavaScript的基礎(chǔ)上,包裝了類型機(jī)制,使其變身成為 靜態(tài)類型 語言。在 TypeScript 中,不僅可以輕易復(fù)用 JavaScript 的代碼、最新特性,還能使用可選的靜態(tài)類型進(jìn)行檢查報(bào)錯,使得編寫的代碼更健壯、更易于維護(hù)。
下面是 JavaScript 項(xiàng)目中最常見的十大錯誤,如果使用 TypeScript,那么在 編寫階段 就可以發(fā)現(xiàn)并解決很多 JavaScript 錯誤了:
類型系統(tǒng)能夠提高代碼的質(zhì)量和可維護(hù)性,經(jīng)過不斷的實(shí)踐,以下兩點(diǎn)尤其需要注意:
可以認(rèn)為,在所有操作符之前,TypeScript 都能檢測到接收的類型(在代碼運(yùn)行時(shí),操作符接收的是實(shí)際數(shù)據(jù);在靜態(tài)檢測時(shí),操作符接收的則是類型)是否被當(dāng)前操作符所支持。當(dāng) TypeScript 類型檢測能力覆蓋到所有代碼后,任意破壞約定的改動都能被自動檢測出來,并提出類型錯誤。因此,可以放心地修改、重構(gòu)業(yè)務(wù)邏輯,而不用擔(dān)憂因?yàn)榭紤]不周而犯下低級錯誤。
在一些語言中,類型總是有一些不必要的復(fù)雜的存在方式,而 TypeScript 盡可能地降低了使用門檻,它是通過如下方式來實(shí)現(xiàn)的。
TypeScript 與 JavaScript 本質(zhì)并無區(qū)別,我們可以將 TypeScipt 理解為是一個添加了類型注解的 JavaScript,為JavaScript代碼提供了編譯時(shí)的類型安全。
實(shí)際上,TypeScript 是一門“ 中間語言 ”,因?yàn)樗罱K會轉(zhuǎn)化為JavaScript,再交給瀏覽器解釋、執(zhí)行。不過 TypeScript 并不會破壞 JavaScript 原有的體系,只是在 JavaScript 的基礎(chǔ)上進(jìn)行了擴(kuò)展。
準(zhǔn)確的說,TypeScript 只是將JavaScript中的方法進(jìn)行了標(biāo)準(zhǔn)化處理:
這段代碼在TypeScript中就會報(bào)錯,因?yàn)門S會知道a是一個數(shù)字類型,不能將其他類型的值賦值給a,這種類型的推斷是很有必要的。
上面說了,TypeScript會盡可能安全的推斷類型。我們也可以使用類型注釋,以實(shí)現(xiàn)以下兩件事:
在一些語言中,類型總是有一些不必要的復(fù)雜的存在方式,而 TypeScript 的類型是結(jié)構(gòu)化的。比如下面的例子中,函數(shù)會接受它所期望的參數(shù):
為了便于把 JavaScript 代碼遷移至 TypeScript,即使存在編譯錯誤,在默認(rèn)的情況下,TypeScript 也會盡可能的被編譯為 JavaScript 代碼。因此,我們可以將JavaScript代碼逐步遷移至 TypeScript。
雖然 TypeScript 是 JavaScript 的超集,但它始終緊跟ECMAScript標(biāo)準(zhǔn),所以是支持ES6/7/8/9 等新語法標(biāo)準(zhǔn)的。并且,在語法層面上對一些語法進(jìn)行了擴(kuò)展。TypeScript 團(tuán)隊(duì)也正在積極的添加新功能的支持,這些功能會隨著時(shí)間的推移而越來越多,越來越全面。
雖然 TypeScript 比較嚴(yán)謹(jǐn),但是它并沒有讓 JavaScript 失去其靈活性。TypeScript 由于兼容 JavaScript 所以靈活度可以媲美 JavaScript,比如可以在任何地方將類型定義為 any(當(dāng)然,并不推薦這樣使用),畢竟 TypeScript 對類型的檢查嚴(yán)格程度是可以通過 tsconfig.json 來配置的。
在搭建TypeScript環(huán)境之前,先來看看適合TypeScript的IDE,這里主要介紹Visual Studio Code,筆者就一直使用這款編輯器。
VS Code可以說是微軟的親兒子了,其具有以下優(yōu)勢:
因?yàn)?VS Code 中內(nèi)置了特定版本的 TypeScript 語言服務(wù),所以它天然支持 TypeScript 語法解析和類型檢測,且這個內(nèi)置的服務(wù)與手動安裝的 TypeScript 完全隔離。因此, VS Code 支持在內(nèi)置和手動安裝版本之間動態(tài)切換語言服務(wù),從而實(shí)現(xiàn)對不同版本的 TypeScript 的支持。
如果當(dāng)前應(yīng)用目錄中安裝了與內(nèi)置服務(wù)不同版本的 TypeScript,我們就可以點(diǎn)擊 VS Code 底部工具欄的版本號信息,從而實(shí)現(xiàn) “use VS Code's Version” 和 “use Workspace's Version” 兩者之間的隨意切換。
除此之外,VS Code 也基于 TypeScript 語言服務(wù)提供了準(zhǔn)確的代碼自動補(bǔ)全功能,并顯示詳細(xì)的類型定義信息,大大的提升了我們的開發(fā)效率。
1)全局安裝TypeScript:
2)初始化配置文件:
執(zhí)行之后,項(xiàng)目根目錄會出現(xiàn)一個 tsconfig.json 文件,里面包含ts的配置項(xiàng)(可能因?yàn)榘姹静煌渲寐杂胁煌?/p>
可以在 package.json 中加入script命令:
3)編譯ts代碼:
TSLint 是一個通過 tslint.json 進(jìn)行配置的插件,在編寫TypeScript代碼時(shí),可以對代碼風(fēng)格進(jìn)行檢查和提示。如果對代碼風(fēng)格有要求,就需要用到TSLint了。其使用步驟如下: (1)在全局安裝TSLint:
(2)使用TSLint初始化配置文件:
執(zhí)行之后,項(xiàng)目根目錄下多了一個 tslint.json 文件,這就是TSLint的配置文件了,它會根據(jù)這個文件對代碼進(jìn)行檢查,生成的 tslint.json 文件有下面幾個字段:
這些字段的含義如下;
在說TypeScript數(shù)據(jù)類型之前,先來看看在TypeScript中定義數(shù)據(jù)類型的基本語法。
在語法層面,缺省類型注解的 TypeScript 與 JavaScript 完全一致。因此,可以把 TypeScript 代碼的編寫看作是為 JavaScript 代碼添加類型注解。
在 TypeScript 語法中,類型的標(biāo)注主要通過類型后置語法來實(shí)現(xiàn):“ 變量: 類型 ”
在 JavaScript 中,原始類型指的是 非對象且沒有方法 的數(shù)據(jù)類型,包括:number、boolean、string、null、undefined、symbol、bigInt。
它們對應(yīng)的 TypeScript 類型如下:
JavaScript原始基礎(chǔ)類型TypeScript類型 numbernumber booleanboolean stringstring nullnull undefinedundefined symbolsymbol bigIntbigInt
需要注意 number 和 Number 的區(qū)別:TypeScript中指定類型的時(shí)候要用 number ,這是TypeScript的類型關(guān)鍵字。而 Number 是 JavaScript 的原生構(gòu)造函數(shù),用它來創(chuàng)建數(shù)值類型的值,這兩個是不一樣的。包括 string 、 boolean 等都是TypeScript的類型關(guān)鍵字,而不是JavaScript語法。
TypeScript 和 JavaScript 一樣,所有數(shù)字都是 浮點(diǎn)數(shù) ,所以只有一個 number 類型。
TypeScript 還支持 ES6 中新增的二進(jìn)制和八進(jìn)制字面量,所以 TypeScript 中共支持 2、8、10和16 這四種進(jìn)制的數(shù)值:
字符串類型可以使用單引號和雙引號來包裹內(nèi)容,但是如果使用 Tslint 規(guī)則,會對引號進(jìn)行檢測,使用單引號還是雙引號可以在 Tslint 規(guī)則中進(jìn)行配置。除此之外,還可以使用 ES6 中的模板字符串來拼接變量和字符串會更為方便。
類型為布爾值類型的變量的值只能是true或者false。除此之外,賦值給布爾值的值也可以是一個計(jì)算之后結(jié)果為布爾值的表達(dá)式:
在 JavaScript 中,undefined和 null 是兩個基本數(shù)據(jù)類型。在 TypeScript 中,這兩者都有各自的類型,即 undefined 和 null,也就是說它們既是實(shí)際的值,也是類型。這兩種類型的實(shí)際用處不是很大。
注意,第一行代碼可能會報(bào)一個tslint的錯誤: Unnecessary initialization to 'undefined' ,就是不能給一個變量賦值為undefined。但實(shí)際上給變量賦值為undefined是完全可以的,所以如果想讓代碼合理化,可以配置tslint,將" no-unnecessary-initializer "設(shè)置為 false 即可。
默認(rèn)情況下,undefined 和 null 是所有類型的子類型,可以賦值給任意類型的值,也就是說可以把 undefined 賦值給 void 類型,也可以賦值給 number 類型。當(dāng)在 tsconfig.json 的"compilerOptions"里設(shè)置為 "strictNullChecks": true 時(shí),就必須嚴(yán)格對待了。這時(shí) undefined 和 null 將只能賦值給它們自身或者 void 類型。這樣也可以規(guī)避一些錯誤。
BigInt是ES6中新引入的數(shù)據(jù)類型,它是一種內(nèi)置對象,它提供了一種方法來表示大于 2- 1 的整數(shù),BigInt可以表示任意大的整數(shù)。
使用 BigInt 可以安全地存儲和操作大整數(shù),即使這個數(shù)已經(jīng)超出了JavaScript構(gòu)造函數(shù) Number 能夠表示的安全整數(shù)范圍。
我們知道,在 JavaScript 中采用雙精度浮點(diǎn)數(shù),這導(dǎo)致精度有限,比如 Number.MAX_SAFE_INTEGER 給出了可以安全遞增的最大可能整數(shù),即 2- 1 ,來看一個例子:
可以看到,最終返回了true,這就是超過精讀范圍造成的問題,而 BigInt 正是解決這類問題而生的:
這里需要用 BigInt(number) 把 Number 轉(zhuǎn)化為 BigInt ,同時(shí)如果類型是 BigInt ,那么數(shù)字后面需要加 n 。
在TypeScript中, number 類型雖然和 BigInt 都表示數(shù)字,但是實(shí)際上兩者類型是完全不同的:
symbol我們平時(shí)用的比較少,所以可能了解也不是很多,這里就詳細(xì)來說說symbol。
symbol 是 ES6 新增的一種基本數(shù)據(jù)類型,它用來表示獨(dú)一無二的值,可以通過 Symbol 構(gòu)造函數(shù)生成。
注意:Symbol 前面不能加 new關(guān)鍵字,直接調(diào)用即可創(chuàng)建一個獨(dú)一無二的 symbol 類型的值。
可以在使用 Symbol 方法創(chuàng)建 symbol 類型值的時(shí)候傳入一個參數(shù),這個參數(shù)需要是一個字符串。如果傳入的參數(shù)不是字符串,會先自動調(diào)用傳入?yún)?shù)的 toString 方法轉(zhuǎn)為字符串:
上面代碼的第三行可能會報(bào)一個錯誤:This condition will always return 'false' since the types 'unique symbol' and 'unique symbol' have no overlap. 這是因?yàn)榫幾g器檢測到這里的 s1 === s2 始終是false,所以編譯器提醒這代碼寫的多余,建議進(jìn)行優(yōu)化。
上面使用Symbol創(chuàng)建了兩個symbol對象,方法中都傳入了相同的字符串,但是兩個symbol值仍然是false,這就說明了 Symbol 方法會返回一個獨(dú)一無二的值。Symbol 方法傳入的這個字符串,就是方便我們區(qū)分 symbol 值的??梢哉{(diào)用 symbol 值的 toString 方法將它轉(zhuǎn)為字符串:
在TypeScript中使用symbol就是指定一個值的類型為symbol類型:
在ES6中,對象的屬性是支持表達(dá)式的,可以使用于一個變量來作為屬性名,這對于代碼的簡化有很多用處,表達(dá)式必須放在大括號內(nèi):
symbol 也可以作為屬性名,因?yàn)閟ymbol的值是獨(dú)一無二的,所以當(dāng)它作為屬性名時(shí),不會與其他任何屬性名重復(fù)。當(dāng)需要訪問這個屬性時(shí),只能使用這個symbol值來訪問(必須使用方括號形式來訪問):
在使用obj.name訪問時(shí),實(shí)際上是字符串name,這和訪問普通字符串類型的屬性名是一樣的,要想訪問屬性名為symbol類型的屬性時(shí),必須使用方括號。方括號中的name才是我們定義的symbol類型的變量name。
使用 Symbol 類型值作為屬性名,這個屬性是不會被 for…in遍歷到的,也不會被 Object.keys() 、 Object.getOwnPropertyNames() 、 JSON.stringify() 等方法獲取到:
雖然這些方法都不能訪問到Symbol類型的屬性名,但是Symbol類型的屬性并不是私有屬性,可以使用 Object.getOwnPropertySymbols 方法獲取對象的所有symbol類型的屬性名:
除了這個方法,還可以使用ES6提供的 Reflect 對象的靜態(tài)方法 Reflect.ownKeys ,它可以返回所有類型的屬性名,Symbol 類型的也會返回:
Symbol 包含兩個靜態(tài)方法, for 和 keyFor 。 1)Symbol.for()
用Symbol創(chuàng)建的symbol類型的值都是獨(dú)一無二的。使用 Symbol.for 方法傳入字符串,會先檢查有沒有使用該字符串調(diào)用 Symbol.for 方法創(chuàng)建的 symbol 值。如果有,返回該值;如果沒有,則使用該字符串新創(chuàng)建一個。使用該方法創(chuàng)建 symbol 值后會在全局范圍進(jìn)行注冊。
上面代碼中,創(chuàng)建了一個iframe節(jié)點(diǎn)并把它放在body中,通過這個 iframe 對象的 contentWindow 拿到這個 iframe 的 window 對象,在 iframe.contentWindow上添加一個值就相當(dāng)于在當(dāng)前頁面定義一個全局變量一樣??梢钥吹剑?iframe 中定義的鍵為 TypeScript 的 symbol 值在和在當(dāng)前頁面定義的鍵為'TypeScript'的symbol 值相等,說明它們是同一個值。
2)Symbol.keyFor() 該方法傳入一個 symbol 值,返回該值在全局注冊的鍵名:
看完簡單的數(shù)據(jù)類型,下面就來看看比較復(fù)雜的數(shù)據(jù)類型,包括JavaScript中的數(shù)組和對象,以及TypeScript中新增的元組、枚舉、Any、void、never、unknown。
在 TypeScript 中有兩種定義數(shù)組的方式:
以上兩種定義數(shù)組類型的方式雖然本質(zhì)上沒有任何區(qū)別,但是更推薦使用第一種形式來定義。一方面可以避免與 JSX 語法沖突,另一方面可以減少代碼量。
注意,這兩種寫法中的 number 指定的是數(shù)組元素的類型,也可以在這里將數(shù)組的元素指定為其他任意類型。如果要指定一個數(shù)組里的元素既可以是數(shù)值也可以是字符串,那么可以使用這種方式: number|string[] 。
在JavaScript中,object是引用類型,它存儲的是值的引用。在TypeScript中,當(dāng)想讓一個變量或者函數(shù)的參數(shù)的類型是一個對象的形式時(shí),可以使用這個類型:
可以看到,當(dāng)給一個對象類型的變量賦值一個對象時(shí),就會報(bào)錯。對象類型更適合以下場景:
在 JavaScript 中并沒有元組的概念,作為一門動態(tài)類型語言,它的優(yōu)勢是支持多類型元素?cái)?shù)組。但是出于較好的擴(kuò)展性、可讀性和穩(wěn)定性考慮,我們通常會把不同類型的值通過鍵值對的形式塞到一個對象中,再返回這個對象,而不是使用沒有任何限制的數(shù)組。TypeScript 的元組類型正好彌補(bǔ)了這個不足,使得定義包含固定個數(shù)元素、每個元素類型未必相同的數(shù)組成為可能。
元組可以看做是數(shù)組的擴(kuò)展,它表示已知元素?cái)?shù)量和類型的數(shù)組,它特別適合用來實(shí)現(xiàn)多值返回。確切的說,就是已知數(shù)組中每一個位置上的元素的類型,可以通過元組的索引為元素賦值::
可以看到,定義的arr元組中,元素個數(shù)和元素類型都是確定的,當(dāng)為arr賦值時(shí),各個位置上的元素類型都要對應(yīng),元素個數(shù)也要一致。
當(dāng)訪問元組元素時(shí),TypeScript也會對元素做類型檢查,如果元素是一個字符串,那么它只能使用字符串方法,如果使用別的類型的方法,就會報(bào)錯。
在TypeScript 新的版本中,TypeScript會對元組做越界判斷。超出規(guī)定個數(shù)的元素稱作越界元素,元素賦值必須類型和個數(shù)都對應(yīng),不能超出定義的元素個數(shù)。
這里定義了接口 Tuple ,它繼承數(shù)組類型,并且數(shù)組元素的類型是 number 和 string 構(gòu)成的聯(lián)合類型,這樣接口 Tuple 就擁有了數(shù)組類型所有的特性。并且指定索引為0的值為 string 類型,索引為1的值為 number 類型,同時(shí)指定 length 屬性的類型字面量為 2,這樣在指定一個類型為這個接口 Tuple 時(shí),這個值必須是數(shù)組,而且如果元素個數(shù)超過2個時(shí),它的length就不是2是大于2的數(shù)了,就不滿足這個接口定義了,所以就會報(bào)錯;當(dāng)然,如果元素個數(shù)不夠2個也會報(bào)錯,因?yàn)樗饕秊?或1的值缺失。
TypeScript 在 ES 原有類型基礎(chǔ)上加入枚舉類型,使得在 TypeScript 中也可以給一組數(shù)值賦予名字,這樣對開發(fā)者比較友好。枚舉類型使用enum來定義:
上面定義的枚舉類型的Roles,它有三個值,TypeScript會為它們每個值分配編號,默認(rèn)從0開始,在使用時(shí),就可以使用名字而不需要記數(shù)字和名稱的對應(yīng)關(guān)系了:
除此之外,還可以修改這個數(shù)值,讓SUPER_ADMIN = 1,這樣后面的值就分別是2和3。當(dāng)然還可以給每個值賦予不同的、不按順序排列的值:
我們可以將一個值定義為any類型,也可以在定義數(shù)組類型時(shí)使用any來指定數(shù)組中的元素類型為任意類型:
any 類型會在對象的調(diào)用鏈中進(jìn)行傳導(dǎo),即any 類型對象的任意屬性的類型都是 any,如下代碼所示:
需要注意:不要濫用any類型,如果代碼中充滿了any,那TypeScript和JavaScript就毫無區(qū)別了,所以除非有充足的理由,否則應(yīng)該盡量避免使用 any ,并且開啟禁用隱式 any 的設(shè)置。
void 和 any 相反,any 是表示任意類型,而 void 是表示沒有類型,就是什么類型都不是。這在 定義函數(shù),并且函數(shù)沒有返回值時(shí)會用到 :
需要注意: void 類型的變量只能賦值為 undefined 和 null ,其他類型不能賦值給 void 類型的變量。
never 類型指永遠(yuǎn)不存在值的類型,它是那些 總會拋出異常 或 根本不會有返回值的函數(shù)表達(dá)式的返回值 類型,當(dāng)變量被永不為真的類型保護(hù)所約束時(shí),該變量也是 never 類型。
下面的函數(shù),總是會拋出異常,所以它的返回值類型是never,用來表明它的返回值是不存在的:
never 類型是任何類型的子類型,所以它可以賦值給任何類型;而沒有類型是 never 的子類型,所以除了它自身以外,其他類型(包括 any 類型)都不能為 never 類型賦值。
上面代碼定義了一個立即執(zhí)行函數(shù),函數(shù)體是一個死循環(huán),這個函數(shù)調(diào)用后的返回值類型為 never,所以賦值之后 neverVariable 的類型是 never 類型,當(dāng)給neverVariable 賦值 123 時(shí),就會報(bào)錯,因?yàn)槌陨硗馊魏晤愋投疾荒苜x值給 never 類型。
基于 never 的特性,我們可以把 never 作為接口類型下的屬性類型,用來禁止操作接口下特定的屬性:
可以看到,無論給 props.name 賦什么類型的值,它都會提示類型錯誤,這就相當(dāng)于將 name 屬性設(shè)置為了只讀 。
unknown 是TypeScript在3.0版本新增的類型,主要用來描述類型并不確定的變量。它看起來和any很像,但是還是有區(qū)別的,unknown相對于any更安全。
對于any,來看一個例子:
上面這些語句都不會報(bào)錯,因?yàn)関alue是any類型,所以后面三個操作都有合法的情況,當(dāng)value是一個對象時(shí),訪問name屬性是沒問題的;當(dāng)value是數(shù)值類型的時(shí)候,調(diào)用它的toFixed方法沒問題;當(dāng)value是字符串或數(shù)組時(shí)獲取它的length屬性是沒問題的。
當(dāng)指定值為unknown類型的時(shí)候,如果沒有 縮小類型范圍 的話,是不能對它進(jìn)行任何操作的??傊?,unknown類型的值不能隨便操作。那什么是類型范圍縮小呢?下面來看一個例子:
這里由于把value的類型縮小為Date實(shí)例的范圍內(nèi),所以進(jìn)行了value.toISOString(),也就是使用ISO標(biāo)準(zhǔn)將 Date 對象轉(zhuǎn)換為字符串。
使用以下方式也可以縮小類型范圍:
關(guān)于 unknown 類型,在使用時(shí)需要注意以下幾點(diǎn):
在實(shí)際使用中,如果有類型無法確定的情況,要盡量避免使用 any,因?yàn)?any 會丟失類型信息,一旦一個類型被指定為 any,那么在它上面進(jìn)行任何操作都是合法的,所以會有意想不到的情況發(fā)生。因此如果遇到無法確定類型的情況,要先考慮使用 unknown。
當(dāng)前標(biāo)題:javascript項(xiàng)目,javascript 開發(fā)
轉(zhuǎn)載來源:http://jinyejixie.com/article0/dsssdoo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)、品牌網(wǎng)站建設(shè)、響應(yīng)式網(wǎng)站、域名注冊、定制開發(fā)、微信小程序
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)