2016-03-11 41 views
4

我正在閱讀latest one of You Don't Know JS series,並在解構部分完全丟失。請幫我理解這裏的片段。這裏的上下文即將使某些指定配置生效,而其他缺省值仍然可用。無法理解這個關於ES6解構的片段

默認值:

var defaults = { 
    options: { 
     remove: true, 
     enable: false, 
     instance: {} 
    }, 
    log: { 
     warn: true, 
     error: true 
    } 
}; 

的配置:

var config = { 
    options: { 
     remove: false, 
     instance: null 
    } 
}; 

如何筆者完成

config.options = config.options || {}; 
config.log = config.log || {}; 
({ 
    options: { 
     remove: config.options.remove = defaults.options.remove, 
     enable: config.options.enable = defaults.options.enable, 
     instance: config.options.instance = 
         defaults.options.instance 
    } = {}, 
    log: { 
     warn: config.log.warn = defaults.log.warn, 
     error: config.log.error = defaults.log.error 
    } = {} 
} = config); 

和作者做了這樣的描述有​​關片段:

上一個片段的方法是有效的,因爲我正在破解 解構和默認機制來爲我執行屬性=== undefined 檢查和分配決定。這是一個技巧,我 解構配置(請參閱代碼段末尾的= config),但 我重新將所有解構後的值重新分配給配置, 與config.options.enable賦值引用。

最困惑的一個是最後一句:與config.options.enable賦值引用。 config.options.enable和config.options的其他屬性有什麼區別?

請問您能否對我的代碼和描述做一些解釋?謝謝!

+1

呃!這就是我稱之爲_cute JavaScript_的地方,作者在犧牲可讀性的前提下做了一些「聰明」的事情,使得未來的讀者很難推斷代碼。 – Mathletics

+0

如果作者在解構之前進行了深度合併,這將會更短,更容易理解。 – Mathletics

回答

2

此代碼使用解構作爲深度合併對象的機制。這很奇怪,不要這樣做。

直接回答你的問題:

是什麼config.options的config.options.enable和其他屬性之間的區別?

沒有區別。作者正在使用config.options.enable來指代看起來像config.options.x = defaults.options.x的所有行。

+0

也許值得一提的是,這並不完美,因爲這在非'undefined'falsy值上失敗。 – loganfsmyth

+0

@loganfsmyth你是絕對正確的,作者在文本本身有更好的解釋(我現在已經把這個問題鏈接了)。我已經更新了我的答案,以解決OP的具體問題。 – Mathletics

+0

@Mathletics謝謝!在閱讀文章之後,我終於得到了整個圖片,並記住冒號「config.options.x」的右邊是目的地。你能否請讓我知道'錯誤承諾'在'不如Object.assign(..)的假承諾(因爲它只是淺的)'意思? – krave

6

這是我的錯字。我剛剛在第二版中提出了一個問題來解決它。我應該說config.enable.XYZ明確表示我指的是所有這些,而不僅僅是那一個。對不起,我的錯誤導致你困惑。