2010-09-24 27 views
7
jQuery.each(player, function(key, val){      
    if (el = $("#pr_attr_plain_"+key)){ 
      el.text(val === "" ? 0 : " " + val); 
    } 
}); 

我繼承了一個項目,並且遇到了一些奇怪的事情。開始這個項目的人是一位經驗豐富的程序員,當然這比我自己更重要。是否有任何價值或理由這樣做(無論多麼糟糕):單個等於一個if。的JavaScript。有什麼好的理由?

if (el = $("#pr_attr_plain_"+key)) 

它現在,它是在我沒有觸及代碼的一部分。我不想改變它,讓它產生意想不到的後果而不知道它會做什麼。

回答

12

它可以是正確的。 代碼等同於:

jQuery.each(player, function(key, val){      
    el = $("#pr_attr_plain_"+key); 
    if (el){ 
      el.text(val === "" ? 0 : " " + val); 
    } 
}); 
+8

我會將此添加爲評論,因爲沒有人提及過它。 '$(..)'將總是返回一個jQuery對象,即使它不匹配任何元素。原始代碼片段不會做它作者認爲它做的事。條件的主體總是會被執行,但是如果'el'是空的,它將是一個空操作,所以沒關係。它應該只是'$(「#pr ..」)。text(...);' – 2010-09-24 23:19:50

+0

其實我已經提到它:)因爲在代碼段中有'jQuery.each'而不是'$ .each' ,也許jQuery運行在不衝突模式? – Tgr 2010-09-25 21:57:14

0

恩,也許測試$運算符?我會危險一個猜測,如果在任務中有錯誤,它將返回false。

3

如果el = $("#pr_attr_plain_"+key)計算結果爲0falsenullundefined,也不會去if塊中。在所有其他情況下,它會。

0

眼下這臺el$("#pr_attr_plain_"+key)。這測試了任務。這將返回true,除非$()失敗,返回null,false0

3

這是寫

el = $("#pr_attr_plain_"+key); 
if (el){ 
     el.text(val === "" ? 0 : " " + val); 
} 

的只是醜陋的方式而這又同

if ($("#pr_attr_plain_"+key)){ 
     $("#pr_attr_plain_"+key).text(val === "" ? 0 : " " + val); 
} 

但稍快(少了一個調用$功能),可以說是更容易閱讀。另一方面,它有幾個問題:

  • $(something)永遠不會評估爲false(它返回一個jQuery對象,這是truthy)。誰寫這可能意味着$(something).length
  • 沒有必要整個if。你可以寫$("#pr_attr_plain_"+key).text(val === "" ? 0 : " " + val);,如果jQuery選擇器不匹配任何元素,它將不起作用。
  • 除非el已被使用,否則您應該寫var el =...而不是el =否則el將是全球性的。
  • ,因爲它是一個常見的錯誤是不小心寫=而不是==,最好是要麼避免分配中的條件,或使用一個額外的括號要清楚你是故意這樣做:

if ((el = $("#pr_attr_plain_"+key))){ 
     el.text(val === "" ? 0 : " " + val); 
} 
+0

或者你也許在混合框架,'$'是Prototype或者其他東西? – Tgr 2010-09-24 22:49:01

0

分配在if說法並不常見,但它突然出現一個在某些語言支持它,並經常被用來使代碼更簡潔。

它通常保留給你想要給臨時變量賦值的情況,以測試它的真實性,然後用它來做其他事情。因此,舉例來說:

if (foo = performExpensiveOperation()){ 
    doSomethingElse(foo); // this only happens if 'foo' is true 
} 

..是比其他短的蠅頭位:

foo = performExpensiveOperation(); 
if (foo) { 
    doSomethingElse(foo); 
} 

不幸的是,使用Javascript不允許在if語句var關鍵字(即if (var foo = bar)是語法錯誤),這意味着你必須首先聲明一個變量(或者更糟糕的是,使用全局變量)。

我也在Perl中看到它的使用,因爲它也具有將變量限制爲if的詞法範圍的作用。這又是Javascript不能做的事情(好吧,支持let即將到來)。

1

正如JSLint指出的那樣,這是一個不好的做法,因爲它也可能是一個常見的錯誤。最好修復它並減少錯誤解釋的可能性。

+0

jslint是我如何找到它的! – JoeM05 2010-09-25 00:09:56

相關問題