2011-05-01 97 views
7

我看到我可以從JavaScript中的相同函數返回不同的類型。這種做法是習慣性的還是應該泄氣?Javascript:不同的返回類型

例如:

somefn = function(e) { 
    switch (e.type) 
    { 
     case 'mousedown': 
     return false; 
     case 'mousemove': 
     return {x:10, y:20}; 
    } 
}; 
+0

2關閉投票,併爲qn提出兩個投票:-) ..我提到我是新來的語言,我知道的所有其他語言不會允許它.. – bsr 2011-05-01 15:38:58

回答

3

請注意,不只是你的函數返回類型不同,但即使可能不會返回任何東西:

somefn({type: 'foo'}); //undefined 

雖然上述不一致的返回行爲氣餒,返回不同的對象類型是常見的,但我可以不要說它是慣用的。

對於可讀性和可維護性我不會推薦回完全不同的對象(如布爾和對象在你的榜樣文字),但只要稍微甚至完全不同的屬性返回對象常量的緣故是很常見:

somefn = function(e) { 

    switch (e.type) 
    { 
    case 'mousedown': 
     return {x:10, y:20, down: false}; 
    case 'mousemove': 
     return {x:10, y:20}; 
    default: 
     return {}; 
    } 
}; 
+2

這很奇怪,我寧願返回'null'而不是創建一個空對象。如果我不得不在'{}'和'false'之間進行選擇,那麼我會用'false'去做,因爲至少我可以做一個簡單的'if(returnValue)',這會在你的代碼中更加複雜......實際上是返回一個*不同*對象的最佳位置(比如'false',但是更好的'null'),因爲我可以通過返回值的布爾值檢查一般成功,並且在檢查通過時將其用作對象。 – davin 2011-05-01 15:31:22

+0

同意,但對於空對象字面值,您可以安全地執行如下操作:'if(somefn(e).down)'。猜猜這是一個品味問題:-)。順便說一句,我真的很喜歡'if({})'在JavaScript中返回'false' ... – 2011-05-01 15:34:07

3

這是很常見的一個函數返回不同類型的對象以JavaScript,只寫它,調用它,並且確定返回值的類型。

3

我會勸阻它。任何使用可根據上下文返回不同類型的函數的代碼都必須檢查返回的值。

但是,有些情況下它是有意義的。假設你有一個解析字符串的函數,例如JSON。在這種情況下,如果輸入字符串是表示數組的JSON字符串,對象是輸入包含對象,布爾值,數字等,則返回數組意義重大。

一般來說,do這會導致最少的驚喜。例如,你的例子會讓我感到驚訝。