亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

JavaScript類(lèi)型檢查之Flow

zhonghanwen / 845人閱讀

摘要:一是一種弱類(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)型檢查工具

1、flow起步
(1)初始化package.json
 npm init -y 
補(bǔ)充:-f(代表force)、-y(代表yes)跳過(guò)提問(wèn)階段,直接生成一個(gè)新的package.json
(2)下載安裝flow
 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ā)要用的

(3)手動(dòng)添加flow

使用npm run flow需要在“scripts”中手動(dòng)添加"flow": "flow"

 {
     "scripts": {
         "test": "echo "Error: no test specified" && exit 1",
         "flow": "flow"
      }
 }
(4)執(zhí)行以下命令,生成 .flowconfig 的空文件
 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]
2、flow使用基本語(yǔ)法
在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è)
1、通過(guò)注釋的方式進(jìn)行添加

(不會(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)行。

2、使用babel進(jìn)行轉(zhuǎ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);
3、flow中的數(shù)據(jù)類(lèi)型
//@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不匹配;
4、簡(jiǎn)化錯(cuò)誤處理代碼

不使用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é)果:

三、 小結(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

相關(guān)文章

  • Flow - JS靜態(tài)類(lèi)型檢查工具

    摘要:介紹是個(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)制...

    seanHai 評(píng)論0 收藏0
  • Flow, 一個(gè)新的Javascript靜態(tài)類(lèi)型檢查

    摘要:原文鏈接翻譯于今天我們興奮的發(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...

    liangzai_cool 評(píng)論0 收藏0
  • JS 靜態(tài)類(lèi)型檢查工具 Flow

    摘要:本文主要介紹了解決作為弱類(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)目中...

    CloudDeveloper 評(píng)論0 收藏0
  • vue2.0項(xiàng)目配置flow類(lèi)型檢查

    摘要:在的項(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ù)...

    Rocko 評(píng)論0 收藏0
  • JavaScript 需要檢查變量類(lèi)型

    摘要:一返回值調(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ù)...

    Songlcy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<