2014-02-14 33 views
1

有沒有辦法將logical operator用於對象屬性?例如,我可以這樣做:如何將JavaScript邏輯運算符用於對象屬性?

var myObj = {}; 
var prop = myObj.prop || 0; 

prop被設置爲0,如果prop不是MyObj中的屬性?但在這裏,

var myObj = {}; 
myObj.prop = 2; 
var prop = myObj.prop || 0; 

myObj.prop是因爲存在這種情況下prop設置爲2。

+0

是否只想'prop'設置爲0,如果'myObj' 1)沒有名爲它自己的屬性'prop',2)在其原型鏈中名稱爲'prop'的任何地方沒有屬性,或者3)有一個名爲'prop'的屬性(無論是#1還是#2),但是它是假的? –

+0

我想要選項#1後面的內容。 –

回答

2

沒有,但你可以使用它三元條件運算符:

var has = Object.prototype.hasOwnProperty; 
var prop = has.call(myObj, 'prop') ? 0 : undefined; 

它不是完美的(將來參考到prop將不再是ReferenceErrormyObj不具有prop屬性的情況下),但沒有使用let沒有更好的方式:

if (!has(...)) { 
    let prop = 0; 
    // Do things with `prop` here 
} 
// prop is still a ReferenceError outside of the if block 
0

你可以做這樣的事情。您可以使用hasOwnProperty方法來檢查該對象是否具有財產或不

var myObj = {}; 
var prop = myObj.hasOwnProperty('prop') || 0; 
+0

但是,如果確實存在,那麼'prop'會將'prop'設置爲'myObj.prop'的值。 –

+1

如果'var myObj = Object.create(null)'下一行將失敗 - 最好使用Object.prototype.hasOwnProperty'來代替。 –

2
var prop = myObj.hasOwnProperty('prop') ? myObj.prop : 0 
+0

只是FYI,如果'myObj = Object.create(null)'這會中斷 - 不要在'Object.prototype'上做無保護的引用。 –

+0

@SeanVieira大聲笑,我想我們都在這裏理所當然。當我運行你的代碼的當前版本'var has = Object.prototype.hasOwnProperty; var prop = has.call(myObj,'prop')? 0:未定義;'我得到'ReferenceError:myObj沒有定義'。 OP包含'var myObj = {};'作爲第一行。 – Matt

+0

Matt,我離開'var myObj =/* *無論你想在這邊* /'出於我的回答,專注於我建議的解決方案,但是如果添加變量,一切都會工作,即使你使用' Object.create(null)'作爲'myObj'的值。 –

0

一個簡單的變體光盤將設置該屬性在你的後備

var prop = myObject.prop || (myObject.prop = 0);