2013-11-04 99 views
0

我已經seend下面的代碼...使用比較參數if語句

var xhr = $.ajax({...}); 
xhr && xhr.abort && xhr.abort(); 
ok(xhr, "XHR object is not null or undefined"); 

之外,努力使第二線感xhr && xhr.abort && xhr.abort();

我想明白是什麼意思,請。

ok(bool , string)

+0

很難說什麼ok函數沒有任何代碼... –

+0

這是一個短路評估的例子。它從左到右進行評估,如果'&&'之前的部分返回true,則只執行'&&'右側的操作。 –

回答

2
xhr && xhr.abort && xhr.abort(); 

定義可以被重新寫爲

if (xhr) { 
    if (xhr.abort) { 
     xhr.abort(); 
    } 
} 

即,如果xhr被定義(不是 'falsy'),並且如果xhr具有限定的abort鍵,然後致電xhr.abort();

如果該行代替:

xhr.abort(); 

然後,如果xhrundefined,則ReferenceError將被拋出。如果xhr.abort不是函數(或undefined),則會引發TypeError

+0

我認爲這很聰明,所以if語句的一個短片對嗎? – Val

+0

@Val是的,你會在腳本語言中看到很多。 'bar && foo()'也是很常見的,在'bar'不是'falsy'的條件下執行'foo()'。即** not **'undefined','false','''''','null'。 – azz

0

第二行是等同於:

if (xhr && xhr.abort && typeof xhr.abort === 'function') { 
    xhr.abort(); 
} 

QUnit檢查,如果前面的語句的第一部分出現故障便會失敗(這意味着XHR從來沒有定義,或者它是null)。

+2

**不等價**,&&隱式轉換爲'Boolean',因此您檢查的是'falsy'值,不一定是函數。 – azz

+0

是的,但除此之外,如果我們只是檢查被定義的xhr.abort,並且我們試圖調用它而不是一個函數,我們會得到一個錯誤。 –

+0

@ KonstantinD-Infragistics OP中的代碼並不檢查'xhr.abort'是否是一個函數。它只檢查它是否存在。因此,第二行和你寫的內容並不相同。 –