2014-10-03 100 views
7

最近我在Swift中進行了很多編程。今天我在JavaScipt中做了一些工作,當問題彈出給我時:JavaScript中的可選鏈接

有沒有類似於JavaScript中的可選鏈接?一種防止undefined is not an object沒有任何變量的方法?

實施例:

function test(){ 
    if(new Date() % 2){ 
     return {value: function(){/*code*/}}; 
    } 
} 

test().value(); 

將失敗的時間,因爲有時test返回未定義一半。

我能想到的唯一解決方案是一個功能:

function oc(object, key){ 
    if(object){ 
     return object[key](); 
    } 
} 

oc(test(), 'value'); 

我希望能夠做一些事情,如:

test()?.value() 

問號後面的部分,如果只執行test返回了一個對象。

但這不是非常典型的。有什麼更好的嗎?運營商的魔力組合?

編輯我知道我可以重寫test返回一些東西。但我想知道是否有可選的鏈接。我對上述示例的特定解決方案不感興趣。如果不能控制返回未定義的函數,我也可以使用它。

+0

你想要什麼值()返回時測試()返回undefined? – 2014-10-03 17:44:20

+0

@ZaheerAhmed錯誤或未定義。真的沒關係。 – idmean 2014-10-03 17:45:08

+0

您可以包裝現有函數以在未定義的情況下返回默認值,而無需重寫。您也可以在調用時使用三元(x?y:z)()或默認運算符(x || y)()。 – dandavis 2014-10-03 17:54:42

回答

5

在普通的JavaScript中,您必須進行類型檢查或構建代碼,以便知道對象將存在。

如果您願意考慮使用預處理語言,CoffeeScript是一種編譯爲JavaScript的語言,它提供了一個用於安全鏈接的存在操作符?.

還有另一個討論here關於爲什麼你不能在JS中重現這種行爲。

還有一個討論on the ESDiscuss forums有關將存在操作符添加到未來版本的JavaScript中的討論。雖然看起來並不是很遠,但實際上遠不及實際應用。在這一點上更多的一個想法。

+2

我接受了你的答案,因爲它真的回答了我的問題,不像下面的其他答案,因爲它提供了一些有趣的信息。 – idmean 2014-10-03 17:56:08

0

如果返回noop函數,當條件不滿足時什麼也不做,那麼怎麼辦?

function test(){ 
    if(new Date() % 2){ 
     return {value: function(){/*code*/}}; 
    } 
    return {value: function(){ /* just return a type consistent with the function above */ } 
} 
+0

這只是一個例子。我在談論我無法控制的功能。 – idmean 2014-10-03 17:45:57

+0

gotcha。抱歉。您需要像Groovy中的「?。」運算符。 JS中沒有這樣的東西。 – sebnukem 2014-10-03 17:47:40

0

如果test是一個對象方法,則可以隨時使用return this;

但是,爲什麼要通過創建模擬函數來防止這種錯誤?

+0

OP提出了一個關於安全鏈接的通用問題,而不是如何構造特定函數以確保安全。 – 2014-10-03 17:52:22

3

您可以使用

test() && test().value(); 

var testResult = test(); 
testResult && testResult.value(); 

如果你問我,這是最相似的斯威夫特的可選鏈接。