總目錄

從C#到TypeScript - 變量

TypeScript的變量聲明和ES6差不多,相比之前主要是多了letconst

為什么不用var

不管是TypeScript還是ES6都會(huì)兼容以前的javascript,所以在TypeScript里var也還是保留了。
雖然C#里也有var,但和JavaScript的可不一樣,var在javascript里會(huì)有一些奇怪的表現(xiàn),比如會(huì)置前,而且作用域是整個(gè)函數(shù),可以不寫(xiě)var來(lái)聲明變量,然后變量變成全局。
這些都可能會(huì)帶了一些不容易注意到的問(wèn)題。
比如經(jīng)典的:

for (var i = 0; i < 10; i++) {
    setTimeout(function() { console.info(i); }, 100);}

結(jié)果并不是期望的0, 1, 2, 3...,跑出來(lái)的結(jié)果全是10,這是因?yàn)?code style="margin: 1px 5px; padding: 0px 5px !important; line-height: 1.8; vertical-align: middle; display: inline-block; font-family: "Courier New", sans-serif !important; font-size: 12px !important; background-color: rgb(245, 245, 245) !important; border: 1px solid rgb(204, 204, 204) !important; border-radius: 3px !important;">var出來(lái)的i的作用域是整個(gè)函數(shù)。
這就導(dǎo)致循環(huán)完成后i變成10,setTimeout內(nèi)的函數(shù)才被執(zhí)行,所以結(jié)果都是10了。
雖然可以用立即完成函數(shù)把重新構(gòu)建一個(gè)作用域,但畢竟用起來(lái)麻煩,而且不符合人的思維,所以就有了let。

使用let聲明變量

let主要是對(duì)var的一個(gè)代替,用let更符合人思考的過(guò)程,這才和C#var的功能是差不多。
let的用法和var是一樣的:

let str = 'string';

let的作用域是塊級(jí)作用域,比如上面的循環(huán),用let聲明i的話就可心得到期望的值

for (let i = 0; i < 10; i++) {
    setTimeout(function() { console.info(i); }, 100);
}

這里得到的結(jié)果就是0, 1, 2....9。
所以建議還是拋棄var,選擇let。

const

C#也有const,意義上差不多,都是常量,不想變量被改變。

const str = 'string';
str = 'new string'; // 編譯不了

一般情況下,主張確定不變的變量用const聲明來(lái)增加代碼健壯性和可讀性。

解構(gòu)

所謂解構(gòu),就是把對(duì)象或數(shù)組里的成員分解出來(lái)。
比如數(shù)組:

let [first, second] = [1, '2', false];console.info(`first: ${first}`);

這里就把數(shù)組的第一個(gè)成員和第二個(gè)成員分別用firstsecond解構(gòu)出來(lái),就省去了分別聲明兩個(gè)變量,并用下標(biāo)取數(shù)組里的值來(lái)賦值了。
這也可以方便的提供一些功能,比如交換數(shù)組里的兩個(gè)值,按以前的做法需要借助下中間變量,現(xiàn)在就不需要了:

let [first, second] = [second, first];

可以利用...擴(kuò)展符號(hào)來(lái)解開(kāi)數(shù)組,再并入其他數(shù)組。

let arr = [1, 2, 3];let newArr = [...arr, 4, 5];console.info(newArr); // 1, 2, 3, 4, 5

對(duì)象同樣可以被解構(gòu):

class Test{
    str = "string";
    int = 1;
    bool = false;

    func(){        console.info('func');
    }
}let {str, bool, func} = new Test(); //名字必須和類(lèi)里的保持一致let {str: newStr} = new Test(); //通過(guò)這種方式可以把str改為newStrconsole.info(`${str}, ${bool}`);
func();

...符號(hào)同樣可以用于對(duì)象,不過(guò)只能解開(kāi)可枚舉的變量,所以函數(shù)不會(huì)解出來(lái)。
延用上面的class:

let {str, ...other} = new Test();console.info(other.int); // 輸出1console.info(other.func()); // 編譯錯(cuò)誤,...符號(hào)不能解出函數(shù)

還可以加上默認(rèn)值,當(dāng)解出來(lái)的值是undefined時(shí)會(huì)用上默認(rèn)值

class Test{
    empty;
    str = '';
}let {empty='empty', str='str'} = new Test();console.info(`${empty}, ${str}`); // 輸出 empty, ,因?yàn)閟tr有值,所以用原始的''

以上就是常用的變量聲明及賦值的使用方法,不過(guò)基本都是ES6的標(biāo)準(zhǔn)語(yǔ)法,TypeScript本身并沒(méi)有在上面多做什么。

http://www.cnblogs.com/brookshi/p/6384619.html