摘要:一是一種弱類(lèi)型動(dòng)態(tài)類(lèi)型檢查的語(yǔ)言。動(dòng)態(tài)類(lèi)型與靜態(tài)類(lèi)型的核心區(qū)別動(dòng)態(tài)類(lèi)型的類(lèi)型檢查是是在代碼運(yùn)行的時(shí)候進(jìn)行的,靜態(tài)類(lèi)型的類(lèi)型檢查則是在編譯時(shí)進(jìn)行。
一、js是一種弱類(lèi)型、動(dòng)態(tài)類(lèi)型檢查的語(yǔ)言。
弱類(lèi)型:在定義變量時(shí),可以為變量定義復(fù)制任何數(shù)據(jù),變量的數(shù)據(jù)類(lèi)型不是固定死的,這樣的類(lèi)型叫做弱類(lèi)型。
var a = 10; a = "abc"; a = []; a = function() {};
強(qiáng)類(lèi)型:在聲明變量時(shí),一旦給變量賦值,那么變量的數(shù)據(jù)類(lèi)型就已經(jīng)確定,之后如果要給該變量賦值其他類(lèi)型的數(shù)據(jù),需要進(jìn)行強(qiáng)制數(shù)據(jù)類(lèi)型轉(zhuǎn)換。
int a = 6; a = "10";
動(dòng)態(tài)類(lèi)型與靜態(tài)類(lèi)型的核心區(qū)別
動(dòng)態(tài)類(lèi)型的類(lèi)型檢查是是在代碼運(yùn)行的時(shí)候進(jìn)行的,靜態(tài)類(lèi)型的類(lèi)型檢查則是在編譯時(shí)進(jìn)行。 運(yùn)行時(shí)類(lèi)型檢查--->`js`: 動(dòng)態(tài)類(lèi)型,類(lèi)型檢查的操作是在運(yùn)行時(shí)進(jìn)行的; 代碼中的錯(cuò)誤,只能在代碼運(yùn)行的時(shí)候被發(fā)現(xiàn)。影響代碼效率和穩(wěn)定性。
靜態(tài)類(lèi)型的優(yōu)勢(shì)
(1)提早發(fā)現(xiàn)代碼中的bug;
function greet(obj){ obj.sayHello(); //報(bào)錯(cuò)沒(méi)有該方法 } var o = { name: "張學(xué)友" } greet(o);
(2)提高代碼的可讀性
// 如果能指定a和b的類(lèi)型 // 指定為數(shù)字,這個(gè)函數(shù)的功能就非常明確了 // a: number // b: number // 返回值: number function sum(a, b){ return a + b; }
(3)減少了復(fù)雜的錯(cuò)誤處理邏輯
/*** * 這個(gè)函數(shù)接收一個(gè)數(shù)字?jǐn)?shù)組作為參數(shù) * 返回這個(gè)數(shù)組中所有數(shù)字的和 * */ // function sum(arr){ // let result = 0; // arr.forEach(v => { // result += v; // }) // return result; // } function sum(arr){ // 首先判斷用戶是否有傳遞參數(shù)進(jìn)來(lái) if(!arr){ throw new Error("函數(shù)需要傳參"); } if(!Array.isArray(arr)){ throw new Error("函數(shù)需要一個(gè)數(shù)組作為參數(shù)"); } if(!arr.every(v => typof v == "number")){ throw new Error("函數(shù)需要的數(shù)組為數(shù)字?jǐn)?shù)組!") } let result = 0; arr.forEach(v => { result += v; }) return result; } sum([1, 2, 3]); sum(100) sum(["a", "b"]) sum()
(4)適合使用IDE(集成開(kāi)發(fā)環(huán)境),容易定位錯(cuò)誤的賦值類(lèi)型。
(5)便于代碼重構(gòu)
function test(num){ console.log(num) } test({name: "郭富城"}) test({name: "郭富城"}) test({name: "郭富城"}) test({name: "郭富城"})
靜態(tài)類(lèi)型的問(wèn)題
增加代碼量(需要寫(xiě)更多類(lèi)型相關(guān)代碼,較復(fù)雜)
需要花時(shí)間掌握類(lèi)型
可能會(huì)降低開(kāi)發(fā)效率
如何在js中使用靜態(tài)類(lèi)型
1> Flow FaceBook 的開(kāi)源技術(shù)
2> TypeScript 微軟公司開(kāi)發(fā)的語(yǔ)言
二、 Flow的基本使用Flow is a static type checker for JavaScript 即:js的靜態(tài)類(lèi)型檢查工具
npm init -y
補(bǔ)充:-f(代表force)、-y(代表yes)跳過(guò)提問(wèn)階段,直接生成一個(gè)新的package.json
npm install --save-dev flow-bin
補(bǔ)充:全局安裝 : 將一個(gè)模塊安裝到系統(tǒng)目錄中,各個(gè)項(xiàng)目都可以調(diào)用。一般來(lái)說(shuō),全局安裝只適用于工具模塊,比如eslint和gulp
npm install XXX -g`
本地安裝 : 指的是將一個(gè)模塊下載到當(dāng)前項(xiàng)目的node_modules子目錄,然后只有在項(xiàng)目目錄之中,才能調(diào)用這個(gè)模塊。
npm install XXX 與 npm install XXX --save (npm install XXX -S) 和
npm install XXX --production,模塊名將被添加dependencies 生產(chǎn)環(huán)境要用的;;
npm install XXX --save-dev (npm install XXX -D),模塊名將被添加到devDependencies 開(kāi)發(fā)要用的
使用npm run flow需要在“scripts”中手動(dòng)添加"flow": "flow"
{ "scripts": { "test": "echo "Error: no test specified" && exit 1", "flow": "flow" } }
npm run flow init
[ignore] //忽略檢測(cè)哪些文件 默認(rèn)檢查項(xiàng)目目錄下所有文件 [include] //檢測(cè)哪些文件 所謂的項(xiàng)目目錄其實(shí)是 .flowconfig 目錄,.flowconfig 所在的目錄就是一個(gè) Flow 項(xiàng)目 [libs] //第三方庫(kù) [lints] [options] [strict]
在flow中如果想要為一個(gè)數(shù)據(jù)添加類(lèi)型 var 變量: 數(shù)據(jù)類(lèi)型 = 數(shù)據(jù);
想要flow檢查那個(gè)文件,就需要給文件添加@flow標(biāo)記,否則flow不會(huì)對(duì)文件進(jìn)行類(lèi)型檢測(cè)
(不會(huì)改寫(xiě)js代碼,代碼在添加完類(lèi)型之后仍然可以正常運(yùn)行)
//@flow var a /*: number*/ = 10; a = "abc"; console.log(a);
執(zhí)行命令:
npm run flow
類(lèi)型檢測(cè)結(jié)果:
通過(guò)注釋方式添加的js 執(zhí)行: node + 要進(jìn)行檢查的js文件, js代碼正常運(yùn)行。
通過(guò)直接給數(shù)據(jù)添加類(lèi)型,改寫(xiě)了js代碼,js代碼運(yùn)行會(huì)報(bào)語(yǔ)法錯(cuò)誤,如果要正常運(yùn)行,需要使用babel進(jìn)行轉(zhuǎn)碼(推薦)
1)安裝babel:
npm install babel-cli babel-preset-flow -D
2)在項(xiàng)目的根目錄中創(chuàng)建一個(gè).babelrc文件:
{ "presets": ["flow"] }
3)在package.json的“scripts”中添加 "build": "babel src/ -d ./dist"
注釋?zhuān)喊研枰狟abel進(jìn)行編譯的文件放到src文件夾下,編譯后的文件放到dist文件夾下,-d表示目錄。
{ "scripts": { "build": "babel src/ -d ./dist" } }
最后運(yùn)行:
//@flow var a: number = 5; function sum(x:number,i:number) { return x + i; } sum(1,2); //上面代碼要正常運(yùn)行的話,需要通過(guò)babel進(jìn)行轉(zhuǎn)碼。 //------------------------------分割線---------------------------------------- // 執(zhí)行`npm run build`后,代碼被編譯成-如下 var a = 5; a = "abc"; function sum(x, i) { return x + i; } sum(1, 2);
//@flow //number類(lèi)型 //number類(lèi)型可以賦值的內(nèi)容為:數(shù)字,NaN, Infinity let a: number = 100; let b: number = NaN; let c: number = Infinity; //string類(lèi)型 //number類(lèi)型可以賦值的內(nèi)容為:字符串 let str1: string = "12334" //boolean 布爾類(lèi)型 //void javascript中的undefined //null js中的null //Array 類(lèi)型 //在聲明數(shù)據(jù)為數(shù)組類(lèi)型的時(shí)候,我們需要為數(shù)組制定元素的類(lèi)型 let arr: Array= [1,2,3]; //any 任意類(lèi)型 let name: any = 123; name = "123"; let arr2: Array = [1,2,"3"] //Object 對(duì)象類(lèi)型 function obj(o:{sayH: () => void}, name: string) { o.sayH(); } let o = { name: "小明", sayH() { console.log("hello") } } obj(o) function ajx(option: {url: string, type: string, success: (data: Object)=> void}) { } ajx() //--------------------------------------------分割線------------------------------------ //Function 函數(shù)類(lèi)型 //@flow function test(a: number, b:number): number { return a + b; } // let d: string = test(1, 2); //可以將變量聲明為函數(shù)類(lèi)型 //也就意味著我們可以指定為變量賦值的函數(shù)的類(lèi)型 let func:(a: number, b:number) => number = test; function ajc(callback:(data: Object) => void) { } ajc(function(obj: Object) { }) //-------------------------------------------分割線------------------------------------- //Maybe類(lèi)型 //@flow //Maybe類(lèi)型相當(dāng)于給數(shù)據(jù)添加了兩個(gè)可能的類(lèi)型null和void function test(a: ?number) { a = a || 0; console.log(a); } test(10); test(); //或操作 let a: number | string = 234; a = "23"; //ok a = true; //error //類(lèi)型推斷 function test(a:number, b: number) { return a + b; } let c: string = test(1,2); //error,推斷函數(shù)返回number類(lèi)型,與string不匹配;
不使用flow:
/** * 功能:傳遞一個(gè)數(shù)字?jǐn)?shù)組,計(jì)算數(shù)組中所有數(shù)字的和并返回結(jié)果; */ function sum(arr) { //是否有參數(shù)傳入 if(!arr) { throw new Error("此函數(shù)需要傳遞一個(gè)數(shù)組作為參數(shù)") } //傳入?yún)?shù)是否是數(shù)組 if(!Array.isArray(arr)) { throw new Error("此函數(shù)需要傳遞一個(gè)數(shù)組參數(shù)") } //傳入?yún)?shù)是否是數(shù)字?jǐn)?shù)組 if(!arr.every(v => typeof v === "number")) { throw new Error("此函數(shù)需要傳遞一個(gè)數(shù)組作為參數(shù),數(shù)組中的元素需要全部為數(shù)字") } let result = 0; arr.forEach(v => { result += v; }) return result; } sum([2,3]);
使用flow:
//@flow function sum(arr: Array) { let result = 0; arr.forEach(v => { result += v; }) return result; } sum([2,"3"]);
結(jié)果:
Flow:
Flow is a static type checker for JavaScript 即:js的靜態(tài)類(lèi)型檢查工具;
給js提供了靜態(tài)類(lèi)型檢查的能力,其實(shí)就是為js添加了一個(gè)編譯過(guò)程;
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/105669.html
摘要:介紹是個(gè)的靜態(tài)類(lèi)型檢查工具,由出品的開(kāi)源碼項(xiàng)目,問(wèn)世只有一年多,是個(gè)相當(dāng)年輕的項(xiàng)目?,F(xiàn)在,提供了另一個(gè)新的選項(xiàng),它是一種強(qiáng)靜態(tài)類(lèi)型的輔助檢查工具。 showImg(https://segmentfault.com/img/bVH6mL?w=1200&h=675); 本章的目標(biāo)是提供一些Flow工具的介紹與使用建議。Flow本質(zhì)上也只是個(gè)檢查工具,它并不會(huì)自動(dòng)修正代碼中的錯(cuò)誤,也不會(huì)強(qiáng)制...
摘要:原文鏈接翻譯于今天我們興奮的發(fā)布了的嘗鮮版,一個(gè)新的靜態(tài)類(lèi)型檢查器。為添加了靜態(tài)類(lèi)型檢查,以提高開(kāi)發(fā)效率和代碼質(zhì)量。這最終形成一個(gè)高度并行增量式的檢查架構(gòu),類(lèi)似。知道縮小類(lèi)型范圍時(shí)做動(dòng)態(tài)檢查的影響。 原文鏈接:https://code.facebook.com/posts/1505962329687926/flow-a-new-static-type-checker-for-java...
摘要:本文主要介紹了解決作為弱類(lèi)型語(yǔ)言沒(méi)有類(lèi)型檢查痛點(diǎn)的靜態(tài)類(lèi)型檢查工具,并且介紹了在中使用的方法,最后介紹了一些常用的語(yǔ)法。 本文主要介紹了解決JS作為弱類(lèi)型語(yǔ)言沒(méi)有類(lèi)型檢查痛點(diǎn)的靜態(tài)類(lèi)型檢查工具 Flow ,并且介紹了在WebStorm中使用Flow的方法,最后介紹了一些常用的Flow語(yǔ)法。 1. 簡(jiǎn)介 JS作為一種腳本語(yǔ)言是沒(méi)有類(lèi)型檢測(cè)的,這個(gè)特點(diǎn)有時(shí)候用著很方便,但在一個(gè)較大的項(xiàng)目中...
摘要:在的項(xiàng)目中加入類(lèi)型檢查。當(dāng)前項(xiàng)目是用寫(xiě)的,當(dāng)項(xiàng)目越來(lái)越大,由于弱類(lèi)型的特性,相比這種強(qiáng)類(lèi)型的語(yǔ)言而言,后期維護(hù)會(huì)越來(lái)越困難。為了解決這個(gè)問(wèn)題,決定使用加入類(lèi)型檢查。一了解是公布的靜態(tài)類(lèi)型檢查器。中配置配置,使其支持語(yǔ)法。 在vue2.0的項(xiàng)目中加入flow類(lèi)型檢查。當(dāng)前項(xiàng)目是用js寫(xiě)的,當(dāng)項(xiàng)目越來(lái)越大,由于js弱類(lèi)型的特性,相比ts(typescript)這種強(qiáng)類(lèi)型的語(yǔ)言而言,后期維護(hù)...
摘要:一返回值調(diào)用外部方法獲取的值需要對(duì)類(lèi)型做判斷,因?yàn)槲覀儗?duì)方法返回的值是有期望值類(lèi)型,但是卻不能保證這個(gè)接口返回的值一直是同一個(gè)類(lèi)型。 19年目標(biāo):消滅英語(yǔ)!我新開(kāi)了一個(gè)公眾號(hào)記錄一個(gè)程序員學(xué)英語(yǔ)的歷程 有提升英語(yǔ)訴求的小伙伴可以關(guān)注公眾號(hào):csenglish 程序員學(xué)英語(yǔ),每天花10分鐘交作業(yè),跟我一起學(xué)英語(yǔ)吧 javascript作為一門(mén)動(dòng)態(tài)類(lèi)型語(yǔ)言,具有很高的動(dòng)態(tài)靈活性,當(dāng)定義函數(shù)...
閱讀 1222·2021-11-24 10:27
閱讀 3520·2021-11-18 10:02
閱讀 2568·2021-11-16 11:45
閱讀 3314·2021-11-15 18:10
閱讀 1001·2021-09-22 15:23
閱讀 1690·2019-08-30 15:53
閱讀 3185·2019-08-30 13:20
閱讀 1833·2019-08-30 12:53