2013-06-27 24 views
8

的CoffeeScript變成user?.id如何在JavaScript中創建CoffeeScript風格的存在操作符?

if (typeof user !== "undefined" && user !== null) { 
    user.id; 
} 

是否有可能創建一個JavaScript函數exists會做同樣的事情?即

exists(user).id 

會導致要麼user.idnull

這將是如果一個函數接受另一個參數更容易,即exists(user, 'id'),但不會那麼好。

+0

對於這一個需要通用干將('definegetter(O,函數(財產){...})',它是,如果我還記得correclty,沒有JavaScript的規範的一部分。 – Zeta

+0

@Zeta不真的,因爲訪問一個對象的不存在的屬性返回'undefined'而不是失敗,這應該是不夠的。 – millimoose

+3

我能想到的最接近的是函數exists(obj){if(obj)return obj; return {}; }',但是不能處理未定義的變量,Javascript在語法上不是這樣可擴展的 – millimoose

回答

5

不,你不能產生這樣的功能。問題是這樣的:

any_function(undeclared_variable) 

會產生的ReferenceError如果undeclared_variable沒有任何地方聲明。例如,如果運行這個獨立的代碼:

function f() { } 
f(pancakes); 

你會得到的ReferenceError因爲pancakes沒有任何地方聲明。演示:http://jsfiddle.net/ambiguous/wSZaL/

然而,typeof operator可以對尚未聲明所以這個東西可以使用:

console.log(typeof pancakes); 

將只需登錄控制檯的undefined。演示:http://jsfiddle.net/ambiguous/et2Nv/

如果你不介意的話可能ReferenceErrors那麼你已經具備必要的功能,在你的問題:

function exists(obj, key) { 
    if (typeof obj !== "undefined" && obj !== null) 
     return obj[key]; 
    return null; // Maybe you'd want undefined instead 
} 

或者,因爲你並不需要能夠在未聲明的變量使用typeof在這裏,您可以簡化它歸結爲:

function exists(obj, key) { 
    if(obj != null) 
     return obj[key]; 
    return null; 
} 

注意改變!=undefined == null是真實的,即使undefined === null不是。

3

非常古老的問題,但讓我想到這個解決方案。

exists = (obj) => obj || {} 
exists(nullableObject).propName; 
相關問題