欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

javascript泛型,什么叫泛型編程

javascript 代碼中的List是什么意思?

這個(gè)就是java代碼中的泛型啊。。意思是這里L(fēng)ist里面只能放int型的對(duì)象

目前成都創(chuàng)新互聯(lián)已為1000多家的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、網(wǎng)站托管維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、河南網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶(hù)導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶(hù)和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

javascript 中的泛型詳解

首先我們來(lái)定義LockingPtr用到的Mutex類(lèi)的骨架:

class Mutex

{

public:

void Acquire();

void Release();

...

};

為了能使用LockingPtr,你要用你操作系統(tǒng)用到的數(shù)據(jù)結(jié)構(gòu)和基本函數(shù)來(lái)實(shí)現(xiàn)Mutex。

LockingPtr用受控的變量的類(lèi)型來(lái)作為模板。舉例來(lái)說(shuō),如果你想管理一個(gè)Widget,你使用一個(gè)LockingPtrWidget,這樣你可以用一個(gè)類(lèi)型為volatile Widget的變量來(lái)初始化它。

LockingPtr的定義非常簡(jiǎn)單。LockingPtr實(shí)現(xiàn)一個(gè)相對(duì)簡(jiǎn)單的smart pointer。它目的只是把一個(gè)const_cast和一個(gè)臨界區(qū)集中在一起。

Template typename T

Class LockingPtr {

Public:

//構(gòu)造/析構(gòu)函數(shù)

LockingPtr(volatile T obj, Mutex mtx)

: pObj_(const_castT*(obj)),

pMtx_(mtx)

{ mtx.Lock(); }

~LockingPtr()

{ pMtx_-Unlock(); }

//模擬指針行為

T operator*()

{ return *pObj_; }

T* operator-()

{ return pObj_; }

private:

T* pObj_;

Mutex* pMtx_;

LockingPtr(const LockingPtr);

LockingPtr operator=(const LockingPtr);

};

盡管簡(jiǎn)單,LockingPtr對(duì)寫(xiě)出正確的多線(xiàn)程代碼非常有幫助。你應(yīng)該把被幾個(gè)線(xiàn)程共享的對(duì)象定義為volatile而且不能對(duì)它們使用const_cast——應(yīng)該始終使用LockingPtr自動(dòng)對(duì)象。我們通過(guò)一個(gè)例子來(lái)說(shuō)明:

假設(shè)你有兩個(gè)線(xiàn)程共享一個(gè)vectorchar對(duì)象

class SyncBuf {

public:

void Thread1();

void Thread2();

private:

typedef vectorchar BufT;

volatile BufT buffer_;

Mutex mtx_; //控制對(duì)buffer_的訪(fǎng)問(wèn)

}; 軟件開(kāi)發(fā)網(wǎng)

在一個(gè)線(xiàn)程函數(shù)中,你簡(jiǎn)單地使用一個(gè)LockingPtrBufT來(lái)取得對(duì)buffer_成員變量的受控訪(fǎng)問(wèn):

void SyncBuf::Thread1() {

LockingPtrBufT lpBuf(buffer_, mtx_);

BufT::iterator I = lpBuf-begin();

For (; I != lpBuf-end(); I) {

...使用*i...

}

}

這些代碼既非常容易寫(xiě)也非常容易懂——任何時(shí)候你需要用到buffer_,你必須創(chuàng)建一個(gè)LockingPtrBufT指向它。一旦你這樣做,你就能夠使用vecotr的所有接口。

非常好的事情是,如果你犯了錯(cuò),編譯器會(huì)指出來(lái):

void SyncBuf::Thread2() {

//錯(cuò)誤,不能對(duì)一個(gè)volatile對(duì)象調(diào)用begin()

BufT::iterator I = buffer_.begin();

//錯(cuò)誤!不能對(duì)一個(gè)volatile對(duì)象調(diào)用end()

for (; I != lpBuf-end(); I) {

...使用*i...

}

}

你不能調(diào)用buffer_的任何函數(shù),除非你要么使用一個(gè)const_cast要么使用LockingPtr。區(qū)別是LockingPtr提供了一個(gè)有序的途徑來(lái)對(duì)volatile變量使用const_cast。

LockingPtr非常有表現(xiàn)力。如果你只需要調(diào)用一個(gè)函數(shù),你能夠創(chuàng)建一個(gè)無(wú)名臨時(shí)LockingPtr對(duì)象并直接使用它:

Unsigned int SyncBuf::Size() {

Return LockingPtrBufT(buffer_, mtx_)-size();

}

回到基本類(lèi)型

我們已經(jīng)看到了volatile保護(hù)對(duì)象不被不受控制地訪(fǎng)問(wèn)時(shí)是多么出色,也看到了LockingPtr提供了多么簡(jiǎn)單和高效的方法來(lái)寫(xiě)線(xiàn)程安全的代碼。讓我們回到基本類(lèi)型,那些加了volatile后行為與用戶(hù)自定類(lèi)型不同的類(lèi)型

我們來(lái)考慮一個(gè)例子,多個(gè)線(xiàn)程共享一個(gè)類(lèi)型為int的變量。

Class Count

{

public:

...

void Increment() { ctr_; }

void Decrement() { --ctr_; }

private:

int ctr_;

};

如果Increment和Decrement被不同線(xiàn)程調(diào)用,上面的代碼片段是有問(wèn)題的。首先,ctr_必須是volatile,其次,即使象 ctr_那樣看上去是原子操作的函數(shù)實(shí)際上是一個(gè)三步操作。內(nèi)存本身沒(méi)有算術(shù)能力,當(dāng)遞增一個(gè)變量時(shí),處理器:

* 讀取那個(gè)變量到寄存器

* 在寄存器中增加值

* 把結(jié)果寫(xiě)回內(nèi)存

這個(gè)三步操作叫做RMW(Read-ModifyWrite 讀-改-寫(xiě))。在執(zhí)行一個(gè)RMW操作的“改”

操作時(shí),為了讓其他處理器訪(fǎng)問(wèn)內(nèi)存,大多數(shù)處理器會(huì)釋放內(nèi)存總線(xiàn)。

如果那時(shí)另一個(gè)處理器對(duì)同一個(gè)變量執(zhí)行一個(gè)RMW操作,我們就有了一個(gè)竟態(tài)條件;第二個(gè)寫(xiě)操作覆蓋了第一個(gè)的結(jié)果。

你也能夠用LockingPtr避免這種情況:

class Counter

{

public:

...

void Increment() { *LockingPtrint(ctr_, mtx_); }

void Decrement() { --*LockingPtrint(ctr_, mtx_); }

private:

volatile int ctr_;

Mutex mtx_;

};

現(xiàn)在代碼正確了,但代碼質(zhì)量比較SyncBuf的代碼而言差了很多。為什么?因?yàn)樵贑ounter里,如果你錯(cuò)誤地直接訪(fǎng)問(wèn)ctr_(沒(méi)有先對(duì)它加鎖)編譯器不會(huì)警告你。如果ctr_是volatile, ctr_也能編譯通過(guò),但產(chǎn)生的代碼明顯是錯(cuò)誤的。編譯器不再是你的幫手了,只有靠你自己注意才能避免這樣的竟態(tài)條件。

那你應(yīng)該怎么做?簡(jiǎn)單地把你用到的基本數(shù)據(jù)包裝為更高層次的結(jié)構(gòu),對(duì)那些結(jié)構(gòu)用volatile。荒謬的是,盡管本來(lái)volatile的用途是用在內(nèi)建類(lèi)型上,但實(shí)際上直接這樣做不是個(gè)好主意!

volatile成員函數(shù)

到目前為止,我們已經(jīng)有了包含有volatile數(shù)據(jù)成員的類(lèi),現(xiàn)在我們來(lái)考慮設(shè)計(jì)作為更大對(duì)象一部分的類(lèi),這些類(lèi)也被多線(xiàn)程共享。在這里用volatile成員函數(shù)有很大幫助。

當(dāng)設(shè)計(jì)你的類(lèi)時(shí),你只對(duì)那些線(xiàn)程安全的成員函數(shù)加voaltile標(biāo)識(shí)。你必須假定外部代碼會(huì)用任何代碼在任何時(shí)刻調(diào)用volatile函數(shù)。不要忘記:volatile等于可自由用于多線(xiàn)程代碼而不用臨界區(qū),非volatile等于單線(xiàn)程環(huán)境或在一個(gè)臨界區(qū)內(nèi)。

例如,你定義一個(gè)Widget類(lèi),實(shí)現(xiàn)一個(gè)函數(shù)的兩個(gè)變化——一個(gè)線(xiàn)程安全的和一個(gè)快的,無(wú)保護(hù)的。

Class Widget

{

public:

void Operation() volatile;

void Operation();

...

private:

Mutex mtx_;

};

注意用了重載。現(xiàn)在Widget的用戶(hù)可以用同樣的語(yǔ)法來(lái)調(diào)用Operation,無(wú)論你為了獲得線(xiàn)程安全調(diào)用volatile對(duì)象的Operation還是為了獲得速度調(diào)用常規(guī)對(duì)象的Operation。但用戶(hù)必須小心地把被多線(xiàn)程共享的Widget對(duì)象定義為volatile。

當(dāng)實(shí)現(xiàn)一個(gè)volatile成員函數(shù)時(shí),第一個(gè)操作通常是對(duì)this用一個(gè)LockingPtr加鎖。剩下的工作可以交給非volatile的對(duì)應(yīng)函數(shù):

軟件開(kāi)發(fā)網(wǎng)

void Widget::Operation() volatile

{

LockingPtrWidget lpThis(*this, mtx_);

LpThis-Operation(); //調(diào)用非volatile函數(shù)

}

總結(jié)

當(dāng)寫(xiě)多線(xiàn)程程序時(shí),你可以用volatile得到好處。你必須遵守下面的規(guī)則:

* 定義所有的被共享的對(duì)象為volatile。

* 不要對(duì)基本類(lèi)型直接用volatile

* 當(dāng)定義可被共享類(lèi)時(shí),使用volatile成員函數(shù)來(lái)表示線(xiàn)程安全。

如果你這樣做,而且如果你使用那個(gè)簡(jiǎn)單的返型組件LockingPtr,你能夠?qū)懗鼍€(xiàn)程安

全的代碼而不用更多考慮竟態(tài)條件,因?yàn)榫幾g器能為你留心,會(huì)為你主動(dòng)指出你錯(cuò)誤的地方。

我參與的幾個(gè)使用volatile和LockingPtr的計(jì)劃獲得很好的效果。代碼清晰易懂。我記得碰到幾處死鎖,但我情愿遇到死鎖也不要竟態(tài)條件,因?yàn)樗梨i調(diào)試起來(lái)容易得多。事實(shí)上沒(méi)有遇到任何問(wèn)題是關(guān)于竟態(tài)條件的。

javascript中var object()和var object={}有什么不同,為什么后者有

首先你寫(xiě)的有問(wèn)題

var object() 這個(gè)還真不知道是什么了

var 是javascript的一個(gè)基礎(chǔ)類(lèi)型的泛型 可以是string int char 等等 也稱(chēng)作弱類(lèi)型

但是他不是一個(gè)函數(shù) 也不能定義成一個(gè)函數(shù)

一般直接定義 var object = 1; var object = " hellow";

還可以是 var object = function double(x){

return 2 * x;

}

或者你因該問(wèn)的是定義函數(shù)的三中方式

第一種:這也是最常規(guī)的一種

function double(x){

return 2 * x;

}

第二種:這種方法使用了Function構(gòu)造函數(shù),把參數(shù)列表和函數(shù)體都作為字符串,很不方便,不建議使用。

var double = new Function('x', 'return 2 * x;');

第三種:

var double = function(x) { return 2* x; }

javascript instanceof 的問(wèn)題

str='123';

str就是字符串類(lèi)型。

但是它并不是對(duì)象。

既然不是對(duì)象,你instanceof 任何東西都不可能是true

除非你這樣聲明

var str = new String('123')

javascript也會(huì)有自動(dòng)拆裝箱的操作。

str = ‘123’

此時(shí)str是基本數(shù)據(jù)類(lèi)型

但當(dāng)你調(diào)用str.substring方法時(shí)。

javascript解釋器會(huì)將str臨時(shí)包裝成一個(gè)String對(duì)象,然后釋放掉。

所以str不是對(duì)象,但有時(shí)候也是對(duì)象。給你造成了困惑。

JavaScript代碼 var msg="";var是什么意思

var 就是相當(dāng)于聲明符, 作用等同于java代碼中的int、String.....。不過(guò)在js中,var是個(gè)泛型,就是你聲明變量無(wú)論是整形還是字符類(lèi)型都用var。

TypeScript是怎么提高JavaScript編程效果的

TypeScript是由微軟開(kāi)發(fā)的一種可快速入門(mén)的開(kāi)源的編程語(yǔ)言,是JavaScript的一個(gè)超集,且向這個(gè)語(yǔ)言添加了可選的靜態(tài)類(lèi)型和基于類(lèi)的面向?qū)ο缶幊獭D軌驇椭鷚eb前端開(kāi)發(fā)人員編出更出色的JavaScript代碼、搞定規(guī)模可觀的JavaScript項(xiàng)目并為ECMAScript 6的來(lái)臨做好準(zhǔn)備。

JavaScript是一款通用腳本語(yǔ)言,植根于開(kāi)發(fā)工具的核心深處,同時(shí)在Node.js等服務(wù)器端實(shí)現(xiàn)方案中也有所體現(xiàn)。除此之外,JavaScript還是微軟開(kāi)發(fā)技術(shù)方案的關(guān)鍵組成部分,若想對(duì)office進(jìn)行擴(kuò)展,不使用JavaScript是不行的。

雖然JavaScript已發(fā)展得非常強(qiáng)悍了,但其離完美還有一大段距離,特別是在構(gòu)建包含大量客戶(hù)端代碼的web應(yīng)用時(shí),JavaScript的不足之處就非常明顯。這個(gè)時(shí)候,配合TypeScript使用,JavaScript的缺陷就可完美解決。只需在TypeScript當(dāng)中編寫(xiě)代碼,而后將其交付至編譯器,即可將所開(kāi)發(fā)代碼轉(zhuǎn)換為能夠運(yùn)行在服務(wù)器端,又可以由客戶(hù)端中的HTML進(jìn)行調(diào)用的JavaScript形式方案。

TypeScript還將大量ECMAScript 6功能加入到了JavaScript當(dāng)中,具體包括類(lèi)與模塊,并嘗試將這兩種本是同根生的語(yǔ)言加以進(jìn)一步融合,從而滿(mǎn)足ECMAScript 6的標(biāo)準(zhǔn)化方法要求。通過(guò)這種方式,大家可以利用TypeScript開(kāi)發(fā)出能夠?yàn)镋CMAScript 6所接納的代碼,同時(shí)充分發(fā)揮TypeScript的靜態(tài)類(lèi)型優(yōu)勢(shì)以提升代碼安全性水平。

TypeScript允許我們面向變量進(jìn)行類(lèi)型聲明,從而確保A始終屬于整數(shù)而C始終屬于字符串。雖然TyperScript的類(lèi)型安全性并不像Fortran那么全面,但其仍然能夠定義數(shù)字與字符串,并利用Boolean類(lèi)型顯著改善代碼調(diào)試機(jī)制。除此之外,TyperScript還提供選項(xiàng)以實(shí)現(xiàn)類(lèi)型推斷,從而降低發(fā)生錯(cuò)誤的可能性如果大家的代碼為兩個(gè)數(shù)字相加,那么TyperScript會(huì)認(rèn)定其結(jié)果始終為數(shù)字。

通過(guò)使用TypeScript,開(kāi)發(fā)者也可以將類(lèi)型應(yīng)用至數(shù)組中,或利用enums為特定變量名稱(chēng)設(shè)置值。如果不確定自己可能使用哪種類(lèi)型,則可以將變量設(shè)定為any,在這種情況下TypeScript不會(huì)推斷其具體類(lèi)型、大家也不會(huì)因此遇到錯(cuò)誤或者警告。TypeScript類(lèi)型可以自行選擇,因此也無(wú)需在編譯或者運(yùn)行之前,首先向現(xiàn)有代碼添加各種類(lèi)型,這將有效簡(jiǎn)化現(xiàn)有代碼的相關(guān)遷移工作。

需要注意的是,現(xiàn)有JavaScript代碼將成為T(mén)ypeScript應(yīng)用程序的一部分加以運(yùn)行。而如果將代碼遷移到ECMAScript 6或者TypeScript語(yǔ)法形式下,大家即可享受到TypeScript的各種功能優(yōu)勢(shì)。而如果我們使用具備TypeScript識(shí)別能力的工具,則可以擁有面向Visual Studio IntelliSense的支持能力——其能夠幫助我們對(duì)函數(shù)調(diào)用中的類(lèi)型進(jìn)行管理。除此之外,也可利用TypeScript聲明文件向各類(lèi)常用庫(kù)及服務(wù)中快速添加類(lèi)型支持,例如jQuery庫(kù)。

擁有這樣一款類(lèi)型化且近似于JavaScript的語(yǔ)言能夠給類(lèi)使用與模塊構(gòu)建帶來(lái)顯著簡(jiǎn)化(與AngularJS當(dāng)中的處理方式非常相近)。類(lèi)型的存在能夠確保某個(gè)警告類(lèi)中的所有實(shí)例都通過(guò)字符串進(jìn)行調(diào)用,這將幫助我們輕松構(gòu)建起更理想的構(gòu)造函數(shù)。大家可以將這種類(lèi)型化構(gòu)造函數(shù)調(diào)用視為一種契約,負(fù)責(zé)定義兩段代碼之間的相互作用——并幫助我們更輕松地在不同應(yīng)用程序之間重復(fù)使用同一函數(shù)。

在函數(shù)調(diào)用當(dāng)中定義類(lèi)型正是創(chuàng)建接口結(jié)構(gòu)的關(guān)鍵所在,能夠使我們的代碼更具面向?qū)ο筇匦浴4蠹铱梢詫⒑瘮?shù)元素明確定義為接口,并選擇在函數(shù)當(dāng)中使用更具描述性的名稱(chēng),同時(shí)又不會(huì)影響到進(jìn)行調(diào)用檢查時(shí)向IntelliSense等函數(shù)所必需的工具發(fā)出通知。

以這種方式定義類(lèi)型與接口,能夠讓多位開(kāi)發(fā)人員輕松對(duì)大型JavaScript項(xiàng)目加以管理。而在函數(shù)與類(lèi)設(shè)計(jì)中秉持“接口至上”的契約化方法,則能夠幫助大家在對(duì)應(yīng)用程序中特定部分進(jìn)行優(yōu)化時(shí)不至于影響到其余部分,或者從其他開(kāi)發(fā)者手中借用某種接口定義并直接運(yùn)用到其它實(shí)現(xiàn)方案當(dāng)中。這種方式允許我們以更為高效的方式使用諸如Git以及GitHub等工具,從而在一套持續(xù)開(kāi)發(fā)模型當(dāng)中輕松管理多個(gè)代碼分支。

如果使用的是Java語(yǔ)言 或者C#語(yǔ)言,那么對(duì)TypeScript(以及ECMAScript 6)的類(lèi)實(shí)現(xiàn)機(jī)制一定不會(huì)感到陌生。大家可以在構(gòu)造函數(shù)之內(nèi)創(chuàng)建類(lèi),從而對(duì)方法中所使用的類(lèi)型進(jìn)行定義,最終利用類(lèi)似的來(lái)處理各種內(nèi)部對(duì)象。大家也可以利用繼承、添加功能與重寫(xiě)方法等方式對(duì)類(lèi)進(jìn)行擴(kuò)展。而更值得注意的是,TypeScript還支持常見(jiàn)于函數(shù)與接口當(dāng)中的泛型——其能夠幫助大家交付可重復(fù)使用的函數(shù)。

一旦掌握了TypeScript處理類(lèi)與函數(shù)的方式, 就可以著手將其組織在模塊當(dāng)中,在這里類(lèi)與函數(shù)能夠被拆分至多個(gè)文件當(dāng)中。這顯然是一種非常便捷的代碼組織方案——舉例來(lái)說(shuō),我們可以利用幾個(gè)文件來(lái)處理購(gòu)物車(chē)當(dāng)中的不同函數(shù)。在此之后,大家可以對(duì)各個(gè)子模塊進(jìn)行分別更新,從而在特定函數(shù)中利用調(diào)整歸零機(jī)制改善其性能水平,同時(shí)又不至于對(duì)其它函數(shù)造成影響。具備聲明文件的JavaScript庫(kù)也可以作為模塊使用,因此大家能夠在TypeScript應(yīng)用程序當(dāng)中充分發(fā)揮由此帶來(lái)的諸多優(yōu)勢(shì)。

在大型web應(yīng)用程序的開(kāi)發(fā)中,對(duì)JavaScript的使用,以TypeScript作為切入點(diǎn),將大大提高我們開(kāi)發(fā)的效率。TypeScript不僅能夠幫助我們?cè)诰邆涑浞终瓶啬芰η易裱芍貜?fù)使用方針的前提下完成編碼工作,同時(shí)也能夠擁有一條通往ECMAScript 6的理想路徑。相信今后web前端開(kāi)發(fā),甚至整個(gè)web端所有網(wǎng)站的開(kāi)發(fā),都將逐步使用到TypeScript,以提高JavaScript的編程效果。

網(wǎng)頁(yè)標(biāo)題:javascript泛型,什么叫泛型編程
URL地址:http://chinadenli.net/article21/dsiecjd.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)手機(jī)網(wǎng)站建設(shè)動(dòng)態(tài)網(wǎng)站移動(dòng)網(wǎng)站建設(shè)做網(wǎng)站網(wǎng)頁(yè)設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

微信小程序開(kāi)發(fā)