2013-08-02 61 views
0

我想用另一個對象構建一個對象作爲參數映射。參數不是強制性的。如果在對象中提取對象的值 - 引用錯誤

爲什麼我不能做到以下幾點:

var Key = function(args) { 
    text in args && this.text = args.text; 
}; 

到我的成員初始化單行?我真的應該如果()...?

感謝您的幫助!

+1

完整的錯誤消息是'ReferenceError:賦值中無效的左側',這就解釋了爲什麼它不起作用以及爲什麼你的答案修復了它。 –

+0

爲什麼不使用'if()'?它最終會成爲與您的解決方案相同數量的字符,並且會更清晰地閱讀。 'if(args中的文本)this.text = args.text' –

+0

當我使用if時,我總是添加括號,以便保持我的代碼統一,以便佔用三行。 – Virus721

回答

1

問題的原因是operator precedence,它不符合所需的含義。

該表達式語句中的最高優先級是.運算符。因爲它具有任何運營商的最高優先級,所以我不打擾使用parens。


下一個優先級最高的是in運營商,所以我們可以用其操作數第一包裹。

(text in args) && this.text = args.text; 

&&操作具有第二高優先級之後,如此反覆,我們可以用它的操作數包裹。

((text in args) && this.text) = args.text; 

所以現在我們可以看到這個問題。我們正試圖將args.text分配給((text in args) && this.text)表達式的結果,該表達式無效,因爲它不是對可解析標識符的分配。因爲我們現在看到我們需要手動強制執行=運算符的優先級,所以我們可以使用我們期望它操作的操作數來包裝它,並調整&&的參數。

((text in args) && (this.text = args.text)); 

而且因爲我們知道,優先級的其餘部分自然制定了罰款爲我們的本意,我們可以擺脫對方括號中。

text in args && (this.text = args.text); 
+0

感謝您的好解釋。我認爲我發現的最後一行是正確的,但我得到一個錯誤:「文本是未定義的」。我應該使用文本作爲字符串:'文本'參數? – Virus721

+0

@ Virus721:如果你沒有'text'變量,並且你實際上打算在'args'對象內尋找一個名爲'「text」'的屬性,那麼是的,你需要一個字符串。 –

+0

@Crasy Train我試過了:'if('args'中的文本)this.text = args.text;'但是它在'operand args'中表示'TypeError:invalid'。我以爲我曾經多次做過這樣的事情,從未有過這些奇怪的問題。 – Virus721