總目錄
從C#到TypeScript - 變量
TypeScript的變量聲明和ES6差不多,相比之前主要是多了let
和const
為什么不用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è)成員分別用first
和second
解構(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