{"componentChunkName":"component---src-templates-blog-post-tsx","path":"/blog/2016/02/02/es6-daily-03-destructuring","result":{"data":{"site":{"siteMetadata":{"title":"童话说","keywords":["thewashingtonhua","github","front-end","javascript","typescript","react","node","washington","hua","童话","童话说","前端","博客","技术","计算机","互联网"]}},"allMarkdownRemark":{"totalCount":84,"edges":[{"node":{"id":"899b40b6-931d-5582-8849-ad164824a190","frontmatter":{"title":"阿里云盘","description":"个人网盘","tags":null,"cover":{"publicURL":"/static/d42b88ce13a4592608ec8325f693ecb3/adrive.jpg"},"series":null,"draft":false,"original":null},"fields":{"id":"adrive","slug":"/project/adrive","type":"project","date":null}}},{"node":{"id":"a18d8b3f-fe18-59c1-bcc1-fcd84958e624","frontmatter":{"title":"FBC","description":"联合办公空间的会员服务","tags":null,"cover":{"publicURL":"/static/73b8b250e607c97c493edf1b542345fa/fbc.jpg"},"series":null,"draft":false,"original":null},"fields":{"id":"fbc","slug":"/project/fbc","type":"project","date":null}}},{"node":{"id":"8b0f2e60-5e93-590c-8f0b-fdb1f9b60f72","frontmatter":{"title":"Fridge","description":"设计资产速查工具","tags":null,"cover":{"publicURL":"/static/97b869f04b74e763be87e4369e4690e3/fridge.jpg"},"series":null,"draft":false,"original":null},"fields":{"id":"fridge","slug":"/project/fridge","type":"project","date":null}}},{"node":{"id":"d2e65cfa-f706-51de-a5af-b49346004338","frontmatter":{"title":"Github-Flutter","description":"基于 Flutter 的 Github 客户端","tags":null,"cover":{"publicURL":"/static/72e94c39ebb670dd23625675c0a22ace/blank.jpg"},"series":null,"draft":true,"original":null},"fields":{"id":"github-flutter","slug":"/project/github-flutter","type":"project","date":null}}},{"node":{"id":"130b94e2-4a4c-5ff6-bcdd-f583151f8e9a","frontmatter":{"title":"影力所","description":"数字货币交易所","tags":null,"cover":{"publicURL":"/static/40ff0dfa20bfd2e8e2b2ea8abb900b5b/inex.jpg"},"series":null,"draft":false,"original":null},"fields":{"id":"inex","slug":"/project/inex","type":"project","date":null}}},{"node":{"id":"d8972347-1404-5f3f-b52f-a96b5d18ad54","frontmatter":{"title":"CSS Scan","description":"VSCode 扩展，自动补全 CSS 变量","tags":null,"cover":{"publicURL":"/static/72e94c39ebb670dd23625675c0a22ace/blank.jpg"},"series":null,"draft":true,"original":null},"fields":{"id":"css-scan","slug":"/project/css-scan","type":"project","date":null}}},{"node":{"id":"1ef032fc-5cff-5d54-b043-5630c19726dd","frontmatter":{"title":"Teambition 网盘","description":"企业级网盘","tags":null,"cover":{"publicURL":"/static/a18be47f8ccb3a72f9a63b94e7e02a89/teamedia.jpg"},"series":null,"draft":false,"original":null},"fields":{"id":"teamedia","slug":"/project/teamedia","type":"project","date":null}}},{"node":{"id":"f939aecc-08da-5e52-be67-4204ba57a43f","frontmatter":{"title":"The Bookmark","description":"Chrome 书签管理器","tags":null,"cover":{"publicURL":"/static/72e94c39ebb670dd23625675c0a22ace/blank.jpg"},"series":null,"draft":true,"original":null},"fields":{"id":"the-bookmark","slug":"/project/the-bookmark","type":"project","date":null}}},{"node":{"id":"d1d07852-8bd0-5f2d-b71e-d581f89f6834","frontmatter":{"title":"The Renamer","description":"批量重命名文件","tags":null,"cover":{"publicURL":"/static/72e94c39ebb670dd23625675c0a22ace/blank.jpg"},"series":null,"draft":true,"original":null},"fields":{"id":"the-renamer","slug":"/project/the-renamer","type":"project","date":null}}},{"node":{"id":"69b8a9b0-5842-5f8a-af9e-7969ae9a52de","frontmatter":{"title":"The Favicon","description":"一站式 Favicon 解决方案","tags":null,"cover":{"publicURL":"/static/956c5d68ba30b313078082a832a80573/the-favicon.jpg"},"series":null,"draft":false,"original":null},"fields":{"id":"the-favicon","slug":"/project/the-favicon","type":"project","date":null}}},{"node":{"id":"e2e9ca5d-5451-5488-bbdb-95d2f726007d","frontmatter":{"title":"The Scanner","description":"可视化磁盘空间分析工具","tags":null,"cover":{"publicURL":"/static/72e94c39ebb670dd23625675c0a22ace/blank.jpg"},"series":null,"draft":true,"original":null},"fields":{"id":"the-scanner","slug":"/project/the-scanner","type":"project","date":null}}},{"node":{"id":"f9d819bd-ec6f-5208-babe-af3321b98849","frontmatter":{"title":"The Spoiler","description":"仿 QQ 影音「剧情连拍」","tags":null,"cover":{"publicURL":"/static/72e94c39ebb670dd23625675c0a22ace/blank.jpg"},"series":null,"draft":true,"original":null},"fields":{"id":"the-spoiler","slug":"/project/the-spoiler","type":"project","date":null}}},{"node":{"id":"03ce08e4-747a-593a-a4b6-c3f880063ba2","frontmatter":{"title":"Thoughts 所思","description":"可协同的在线富文本编辑器","tags":null,"cover":{"publicURL":"/static/faff3495c115cab9b6fd951f3c6b96f9/thoughts.jpg"},"series":null,"draft":false,"original":null},"fields":{"id":"thoughts","slug":"/project/thoughts","type":"project","date":null}}},{"node":{"id":"66e250ec-9f77-59c4-89ad-62de1da8af4f","frontmatter":{"title":"阅流","description":"音视频资产管理与协同工作流平台","tags":null,"cover":{"publicURL":"/static/9714ee2418af11ae8e80156b953176e5/yueliu.jpg"},"series":null,"draft":false,"original":null},"fields":{"id":"xinyue","slug":"/project/xinyue","type":"project","date":null}}},{"node":{"id":"96d8262a-1a3a-5d8d-927a-61a92af40bbb","frontmatter":{"title":"Xshowroom 买手圈","description":"时尚业专业买手服务平台","tags":null,"cover":{"publicURL":"/static/72ea2ae7921cb5aa0b3b4f56578ed2b9/xshowroom.jpg"},"series":null,"draft":false,"original":null},"fields":{"id":"xshowroom","slug":"/project/xshowroom","type":"project","date":null}}},{"node":{"id":"6f90759d-2425-5cd2-b498-b62726e30328","frontmatter":{"title":"基于 Monorepo 的项目架构","description":"分久必合","tags":["architecture","monorepo","架构"],"cover":{"publicURL":"/static/d221320d45d5d7ac530fe7af1ab4cd79/blank.jpg"},"series":"","draft":true,"original":true},"fields":{"id":"blog/draft/design-a-monorepo-project","slug":"/blog/blog/draft/design-a-monorepo-project","type":"blog","date":null}}},{"node":{"id":"ef1d93e7-33e6-5c26-8a0b-fcb475a4a7bd","frontmatter":{"title":"自己动手做一个播放器","description":"一潭看起来很浅的深水","tags":["media","video","audio"],"cover":{"publicURL":"/static/d221320d45d5d7ac530fe7af1ab4cd79/blank.jpg"},"series":"","draft":true,"original":true},"fields":{"id":"blog/draft/custom-media-player","slug":"/blog/blog/draft/custom-media-player","type":"blog","date":null}}},{"node":{"id":"cbeb2307-591f-54ae-8ff1-48f59949994d","frontmatter":{"title":"「童话说」又改版啦","description":"只为遇见更好的自己","tags":["blog","4.0","update"],"cover":{"publicURL":"/static/d221320d45d5d7ac530fe7af1ab4cd79/blank.jpg"},"series":"","draft":true,"original":true},"fields":{"id":"blog/draft/introducing-ths-v4","slug":"/blog/blog/draft/introducing-ths-v4","type":"blog","date":null}}},{"node":{"id":"629e72b7-0c5b-5119-a4eb-2117f81c1c74","frontmatter":{"title":"让你的 Electron 应用更像原生","description":"青出于蓝，就得够蓝","tags":["electron"],"cover":{"publicURL":"/static/d221320d45d5d7ac530fe7af1ab4cd79/blank.jpg"},"series":"","draft":true,"original":true},"fields":{"id":"blog/draft/make-electron-app-like-native","slug":"/blog/blog/draft/make-electron-app-like-native","type":"blog","date":null}}},{"node":{"id":"d268eb02-e779-5455-920f-246feac07c7e","frontmatter":{"title":"聊聊前端架构","description":"前端如果只是写写页面的话，路就走窄了","tags":["architecture","架构"],"cover":{"publicURL":"/static/d221320d45d5d7ac530fe7af1ab4cd79/blank.jpg"},"series":"","draft":true,"original":true},"fields":{"id":"blog/draft/frontend-architecture","slug":"/blog/blog/draft/frontend-architecture","type":"blog","date":null}}},{"node":{"id":"831f0b6d-239a-57bc-9df2-9515c8033613","frontmatter":{"title":"Fridge 背后的故事","description":"能动手的，咱们尽量别吵吵","tags":["electron","iconfont","svg","fridge"],"cover":{"publicURL":"/static/d221320d45d5d7ac530fe7af1ab4cd79/blank.jpg"},"series":"","draft":true,"original":true},"fields":{"id":"blog/draft/story-behind-fridge","slug":"/blog/blog/draft/story-behind-fridge","type":"blog","date":null}}},{"node":{"id":"f7b25b63-8a8f-5c85-8d99-e6513c498f70","frontmatter":{"title":"多端 Web 应用实践","description":"去往梦想的路，总是坑坑洼洼的","tags":["cross-platform"],"cover":{"publicURL":"/static/d221320d45d5d7ac530fe7af1ab4cd79/blank.jpg"},"series":"","draft":true,"original":true},"fields":{"id":"blog/draft/web-cross-platform-in-action","slug":"/blog/blog/draft/web-cross-platform-in-action","type":"blog","date":null}}},{"node":{"id":"06f78e85-6919-5c8b-acd3-87868117a0b8","frontmatter":{"title":"当我想要复用一些代码时","description":"懒惰真的是人类进步的最大动力","tags":["npm","monorepo","design pattern"],"cover":{"publicURL":"/static/d221320d45d5d7ac530fe7af1ab4cd79/blank.jpg"},"series":"","draft":true,"original":true},"fields":{"id":"blog/draft/when-i-want-to-reuse-some-code","slug":"/blog/blog/draft/when-i-want-to-reuse-some-code","type":"blog","date":null}}},{"node":{"id":"e48043ee-92d6-5f14-a21e-25316a24d6fc","frontmatter":{"title":"为什么我们总是在不断地造轮子","description":"圆的圆的圆的东西","tags":["thinking"],"cover":{"publicURL":"/static/120fefa8e824de66889cf2e45b746ebe/wheel.jpg"},"series":"","draft":true,"original":true},"fields":{"id":"blog/draft/why-do-we-keep-building-wheels","slug":"/blog/blog/draft/why-do-we-keep-building-wheels","type":"blog","date":null}}},{"node":{"id":"235647b7-ab40-5666-8a43-5e3f0b84bc15","frontmatter":{"title":"金三银四，聊聊前端面试","description":"人嘛，总是在不断的试错中成长起来的","tags":["interview"],"cover":{"publicURL":"/static/d221320d45d5d7ac530fe7af1ab4cd79/blank.jpg"},"series":"","draft":true,"original":true},"fields":{"id":"thoughts-about-fe-interview","slug":"/blog/2022/03/01/thoughts-about-fe-interview","type":"blog","date":"2022-03-01"}}},{"node":{"id":"8605b9b5-c87c-561f-b9c5-eae2b52d86c1","frontmatter":{"title":"聊聊「深色模式」","description":"你说的黑不是黑，你说的暗是什么暗","tags":["design","dark"],"cover":{"publicURL":"/static/d221320d45d5d7ac530fe7af1ab4cd79/blank.jpg"},"series":"","draft":true,"original":true},"fields":{"id":"dark-mode","slug":"/blog/2021/11/30/dark-mode","type":"blog","date":"2021-11-30"}}},{"node":{"id":"a8057f61-f41c-59b9-a6f0-20e928096314","frontmatter":{"title":"日志 - 软件系统的黑匣子","description":"前端如果只是写写页面的话，路就走窄了","tags":["log","日志"],"cover":{"publicURL":"/static/d221320d45d5d7ac530fe7af1ab4cd79/blank.jpg"},"series":"","draft":true,"original":true},"fields":{"id":"log-black-box-for-software","slug":"/blog/2021/12/27/log-black-box-for-software","type":"blog","date":"2021-12-27"}}},{"node":{"id":"78accc1d-9509-5bb3-9dc5-f47e1f336faf","frontmatter":{"title":"设计一套乐观更新机制","description":"做人呐，最重要的就是乐观啦","tags":["design","optimistic","update"],"cover":{"publicURL":"/static/92603cdac7e5c420caea18ea2c459646/optimistic-update.jpg"},"series":"","draft":false,"original":true},"fields":{"id":"building-an-optimisic-update-mechanism","slug":"/blog/2020/07/13/building-an-optimisic-update-mechanism","type":"blog","date":"2020-07-13"}}},{"node":{"id":"f8010292-2ae9-55e9-8dc1-b161e1ed0e8e","frontmatter":{"title":"我的数组返回了啥","description":"功夫再高，一针下去也得倒","tags":["javascript","array"],"cover":{"publicURL":"/static/2cc085eb3cdf21f44644810589c3bd8a/array.jpg"},"series":"","draft":false,"original":true},"fields":{"id":"what-does-my-array-return","slug":"/blog/2020/12/07/what-does-my-array-return","type":"blog","date":"2020-12-07"}}},{"node":{"id":"cce39a0a-715e-52b1-9ffc-4bedcaa986f3","frontmatter":{"title":"一个非著名前端开发者的 2020","description":"继续，让进步发生","tags":["summary","2020","2021"],"cover":{"publicURL":"/static/40556f5636111e701f3949914488b854/summary-2020.jpg"},"series":"summary","draft":false,"original":true},"fields":{"id":"summary-2020","slug":"/blog/2020/12/31/summary-2020","type":"blog","date":"2020-12-31"}}},{"node":{"id":"3a2d2bcd-1ecc-5974-9394-efb756f1f1a9","frontmatter":{"title":"你铁定已经知道的 ES 2020","description":"迟到，总比不到好","tags":["ecmascript","2020"],"cover":{"publicURL":"/static/5bbe9cbd4d341256fe533f89aa242cb6/es2020.jpg"},"series":"ecmascript","draft":false,"original":true},"fields":{"id":"es-2020","slug":"/blog/2020/12/28/es-2020","type":"blog","date":"2020-12-28"}}},{"node":{"id":"a2307fdb-e855-5054-bb5c-5afcd8b4486b","frontmatter":{"title":"除了 SSR，就没有别的办法了吗","description":"当 MVVM 遇上 SEO，该如何是好","tags":["static","site","gatsby","pug"],"cover":{"publicURL":"/static/c2ac5cf49eafd77a1b2ce1fab7f53515/explore-static-site-generation.jpg"},"series":"","draft":false,"original":true},"fields":{"id":"explore-static-site-generation","slug":"/blog/2019/02/07/explore-static-site-generation","type":"blog","date":"2019-02-07"}}},{"node":{"id":"1c714ef9-56d1-5ce8-aa92-ad38fb776c27","frontmatter":{"title":"你可能已经知道的 ES 2018 和 2019","description":"好饭不怕晚","tags":["ecmascript","2018","2019"],"cover":{"publicURL":"/static/5646b4878e533cd7c725ce4c17984071/es2019.jpg"},"series":"ecmascript","draft":false,"original":true},"fields":{"id":"es2018-and-es2019","slug":"/blog/2019/02/11/es2018-and-es2019","type":"blog","date":"2019-02-11"}}},{"node":{"id":"36b1a9b7-cbb3-5603-8b82-4d208c3b8a90","frontmatter":{"title":"【译】我们为什么要写 super(props)?","description":"好像知道，又好像不知道","tags":["react"],"cover":{"publicURL":"/static/9fbf74366dc5b9e4aab57572a9f0470d/overreacted.jpg"},"series":"overreacted","draft":false,"original":false},"fields":{"id":"why-do-we-write-super-props","slug":"/blog/2019/02/22/why-do-we-write-super-props","type":"blog","date":"2019-02-22"}}},{"node":{"id":"60328fae-7371-5510-8f73-e804ed636097","frontmatter":{"title":"如何 Think in Hooks","description":"差不多是时候该换换脑子了","tags":["react","hooks"],"cover":{"publicURL":"/static/26d13ef2591ee05a3c4bba7fc34daa88/think-in-hooks.jpg"},"series":"","draft":false,"original":true},"fields":{"id":"how-to-think-in-hooks","slug":"/blog/2019/02/15/how-to-think-in-hooks","type":"blog","date":"2019-02-15"}}},{"node":{"id":"cee0c8aa-e571-5394-a0fa-84dedb9bd3c0","frontmatter":{"title":"【译】React 如何区分 Class 和 Function？","description":"所谓的简单，只是因为有人帮你把复杂的问题给解决掉了","tags":["react"],"cover":{"publicURL":"/static/9fbf74366dc5b9e4aab57572a9f0470d/overreacted.jpg"},"series":"overreacted","draft":false,"original":false},"fields":{"id":"how-does-react-tell-a-class-from-a-function","slug":"/blog/2019/03/06/how-does-react-tell-a-class-from-a-function","type":"blog","date":"2019-03-06"}}},{"node":{"id":"1bd98cff-a13f-5d96-a821-4e8b172460f2","frontmatter":{"title":"探索 React 组件之间的生命周期","description":"有时候，生活就是一团麻","tags":["react","lifecycle"],"cover":{"publicURL":"/static/0edf69056144aaf512a28d0670b53b57/react-lifecycle.jpg"},"series":"","draft":false,"original":true},"fields":{"id":"react-lifecycle","slug":"/blog/2019/05/02/react-lifecycle","type":"blog","date":"2019-05-02"}}},{"node":{"id":"4d37b609-e7b3-544a-9c20-f50ace245da1","frontmatter":{"title":"TypeScript 次日指南","description":"坑这种东西，是不会写在文档上的","tags":["typescript"],"cover":{"publicURL":"/static/8239307adc5ccdfc32320e1bcadb6300/typescript.jpg"},"series":"","draft":false,"original":true},"fields":{"id":"typescript-the-second-day","slug":"/blog/2019/07/28/typescript-the-second-day","type":"blog","date":"2019-07-28"}}},{"node":{"id":"1bca0d32-a7ee-5439-a55f-9d75e9426eb1","frontmatter":{"title":"重新 Think in Hooks","description":"忘记过去之所学，我们从头来过","tags":["react","hooks"],"cover":{"publicURL":"/static/f9fcd719dcab55af4a1ad3d3cfbe0585/rethink-in-hooks.jpg"},"series":"","draft":false,"original":true},"fields":{"id":"rethink-in-hooks","slug":"/blog/2019/05/27/rethink-in-hooks","type":"blog","date":"2019-05-27"}}},{"node":{"id":"38745745-24e5-5fd0-b893-a81ccdeed4e8","frontmatter":{"title":"TypeScript：又一个终将逝去的青春","description":"你，轰轰烈烈地来；你，平平淡淡地走。","tags":["typescript"],"cover":{"publicURL":"/static/b7b7642447ca6a5b28abf9f90bf06ef8/typescript-another-fading-youth.jpg"},"series":"","draft":false,"original":true},"fields":{"id":"typescript-another-fading-youth","slug":"/blog/2019/10/10/typescript-another-fading-youth","type":"blog","date":"2019-10-10"}}},{"node":{"id":"1b946c8e-4515-5f6a-bff0-9d63a338fca9","frontmatter":{"title":"Homebrew 也有后悔药：回退一次小版本更新","description":"有了后悔药，可劲随便造","tags":["homebrew"],"cover":{"publicURL":"/static/2cd1cc709ca5d68b1a1fb9eb6283b820/homebrew.jpg"},"series":"","draft":false,"original":true},"fields":{"id":"how-to-downgrade-from-homebrew","slug":"/blog/2019/10/11/how-to-downgrade-from-homebrew","type":"blog","date":"2019-10-11"}}},{"node":{"id":"b5e8773f-6dff-512b-98df-725d27df8f4f","frontmatter":{"title":"每天一点ES6(14)：Iterator","description":"遍历也能搞出花来，怎么遍历你说了算","tags":["ecmascript","2015","es6","javascript","iterator","generator"],"cover":{"publicURL":"/static/0950334fb8899f1006423341cbfeecb9/es6daily.jpg"},"series":"es6daily","draft":false,"original":true},"fields":{"id":"es6-daily-14-iterator","slug":"/blog/2018/02/28/es6-daily-14-iterator","type":"blog","date":"2018-02-28"}}},{"node":{"id":"e4cb7abe-3cde-5832-a981-7128e5c0d895","frontmatter":{"title":"一个非著名前端开发者的 2019","description":"感谢曾经努力的自己","tags":["summary","2019","2020"],"cover":{"publicURL":"/static/1011f23d2ed2635035a07878c03ed1da/summary-2019.jpg"},"series":"summary","draft":false,"original":true},"fields":{"id":"summary-2019","slug":"/blog/2019/12/31/summary-2019","type":"blog","date":"2019-12-31"}}},{"node":{"id":"ce78757a-076a-5b89-9be0-9ac597211f81","frontmatter":{"title":"每天一点ES6(15)：Promise","description":"对你的承诺，永远不变","tags":["ecmascript","2015","es6","javascript","promise"],"cover":{"publicURL":"/static/0950334fb8899f1006423341cbfeecb9/es6daily.jpg"},"series":"es6daily","draft":false,"original":true},"fields":{"id":"es6-daily-15-promise","slug":"/blog/2018/03/04/es6-daily-15-promise","type":"blog","date":"2018-03-04"}}},{"node":{"id":"4768bfd5-810a-597a-b108-4478ae7b0c62","frontmatter":{"title":"每天一点ES6(16)：Generator","description":"一起来摩擦摩擦发电吧","tags":["ecmascript","2015","es6","javascript","promise"],"cover":{"publicURL":"/static/0950334fb8899f1006423341cbfeecb9/es6daily.jpg"},"series":"es6daily","draft":false,"original":true},"fields":{"id":"es6-daily-16-generator","slug":"/blog/2018/06/14/es6-daily-16-generator","type":"blog","date":"2018-06-14"}}},{"node":{"id":"f06b7a4d-10f9-5a92-be83-9e703c97b24a","frontmatter":{"title":"每天一点ES6(17)：Async / Await","description":"异步？先等等！","tags":["ecmascript","2015","es6","javascript","async","await","generator"],"cover":{"publicURL":"/static/0950334fb8899f1006423341cbfeecb9/es6daily.jpg"},"series":"es6daily","draft":false,"original":true},"fields":{"id":"es6-daily-17-async-await","slug":"/blog/2018/10/06/es6-daily-17-async-await","type":"blog","date":"2018-10-06"}}},{"node":{"id":"1459c3df-c925-54f1-b807-e4a212f2c4bd","frontmatter":{"title":"每天一点ES6(18)：Class","description":"这回总没人质疑 JS 不是面向对象了吧？","tags":["ecmascript","2015","es6","javascript","class"],"cover":{"publicURL":"/static/0950334fb8899f1006423341cbfeecb9/es6daily.jpg"},"series":"es6daily","draft":false,"original":true},"fields":{"id":"es6-daily-18-class","slug":"/blog/2018/12/17/es6-daily-18-class","type":"blog","date":"2018-12-17"}}},{"node":{"id":"ab6648bb-2a63-5907-9644-5bb1c03f3d13","frontmatter":{"title":"每天一点ES6(19)：Module","description":"可能是 ES6 中对未来影响最大的一项改变","tags":["ecmascript","2015","es6","javascript","module","import","export"],"cover":{"publicURL":"/static/0950334fb8899f1006423341cbfeecb9/es6daily.jpg"},"series":"es6daily","draft":false,"original":true},"fields":{"id":"es6-daily-19-module","slug":"/blog/2018/12/19/es6-daily-19-module","type":"blog","date":"2018-12-19"}}},{"node":{"id":"acaadd98-c9a3-5f8d-8592-9eb580993d5a","frontmatter":{"title":"解决 macOS 下 MySQL 2002 错误","description":"MySQL 真是个磨人的小妖精","tags":["mac","mysql","2002"],"cover":{"publicURL":"/static/6f1abf9c085f6538df6bced86e008157/mysql-error-2002.jpg"},"series":"","draft":false,"original":true},"fields":{"id":"mysql-error-2002","slug":"/blog/2017/02/07/mysql-error-2002","type":"blog","date":"2017-02-07"}}},{"node":{"id":"2980c140-8128-583c-b715-00c459639f74","frontmatter":{"title":"TradingView + WebSocket 脱坑指南","description":"让我来告诉你，K 线到底该怎么画","tags":["tradingview","chart","library","guide","websocket","webworker","ohlc","kchart"],"cover":{"publicURL":"/static/1ceaf53d99815784a18273970e741bfd/tradingview.jpg"},"series":"","draft":false,"original":true},"fields":{"id":"tradingview-charting-library-simple-guide","slug":"/blog/2018/09/22/tradingview-charting-library-simple-guide","type":"blog","date":"2018-09-22"}}},{"node":{"id":"a320306e-d8c5-57d0-bccd-65654be47ebe","frontmatter":{"title":"记 new Date().toString() 的一个坑","description":"万万没想到，竟在这里踩了个坑……","tags":["javascript","date","tostring"],"cover":{"publicURL":"/static/e192283893c7e97feb631571134bb805/date-tostring.jpg"},"series":"","draft":false,"original":true},"fields":{"id":"a-pit-in-date-tostring","slug":"/blog/2017/03/08/a-pit-in-date-tostring","type":"blog","date":"2017-03-08"}}},{"node":{"id":"675cdc47-ff83-5d54-b1f6-9eb1ab727257","frontmatter":{"title":"一个非著名前端开发者的 2018","description":"资本寒冬大概是属燕子的吧，一到年末出现","tags":["summary","2018","2019"],"cover":{"publicURL":"/static/0e9c38c3d5d6b94d53a8dee2a7bdfbae/summary-2018.jpg"},"series":"summary","draft":false,"original":true},"fields":{"id":"summary-2018","slug":"/blog/2018/12/31/summary-2018","type":"blog","date":"2018-12-31"}}},{"node":{"id":"3d497cac-d699-51f6-a002-70934f8f6885","frontmatter":{"title":"iOS 下 click() 无效的问题","description":"iOS这个傲娇的小公举","tags":["ios","click"],"cover":{"publicURL":"/static/f79051a5758b8a973902b2e5d190b714/ios-click.jpg"},"series":"","draft":false,"original":true},"fields":{"id":"unable-to-trigger-click-on-ios","slug":"/blog/2017/03/31/unable-to-trigger-click-on-ios","type":"blog","date":"2017-03-31"}}},{"node":{"id":"48340073-afd2-514f-94c7-db3af2dc5796","frontmatter":{"title":"每天一点ES6(10)：对象的扩展","description":"迟来的更新……","tags":["ecmascript","2015","es6","javascript","object"],"cover":{"publicURL":"/static/0950334fb8899f1006423341cbfeecb9/es6daily.jpg"},"series":"es6daily","draft":false,"original":true},"fields":{"id":"es6-daily-10-object","slug":"/blog/2017/04/05/es6-daily-10-object","type":"blog","date":"2017-04-05"}}},{"node":{"id":"870a098a-b7e9-5ed2-bef5-f04a6b9f451f","frontmatter":{"title":"Leetcode 第一刷：Two Sum","description":"都闪开，我要开始装逼了","tags":["leetcode","two","sum"],"cover":{"publicURL":"/static/1aa86b8eea674fca29117e535cfba751/leetcode.jpg"},"series":"","draft":false,"original":true},"fields":{"id":"leetcode-01-two-sum","slug":"/blog/2017/04/11/leetcode-01-two-sum","type":"blog","date":"2017-04-11"}}},{"node":{"id":"9d030bff-d2d5-56ca-8bd6-4f994f728eee","frontmatter":{"title":"PHP 处理多源 CORS 的解决办法","description":"一个老生常谈的话题，碰到了顺便记录一下","tags":["php","cors"],"cover":{"publicURL":"/static/77fc63594cf3a06c31921df671acd258/cors.jpg"},"series":"","draft":false,"original":true},"fields":{"id":"multi-origin-cors-with-php","slug":"/blog/2017/03/30/multi-origin-cors-with-php","type":"blog","date":"2017-03-30"}}},{"node":{"id":"6d2ed849-7eaf-57bb-b08e-89dc9bab9ce0","frontmatter":{"title":"每天一点ES6(11)：Symbol","description":"原始类型家族的新成员","tags":["ecmascript","2015","es6","javascript","symbol"],"cover":{"publicURL":"/static/0950334fb8899f1006423341cbfeecb9/es6daily.jpg"},"series":"es6daily","draft":false,"original":true},"fields":{"id":"es6-daily-11-symbol","slug":"/blog/2017/07/02/es6-daily-11-symbol","type":"blog","date":"2017-07-02"}}},{"node":{"id":"070c2a8f-3033-5739-a1ff-0e54e104f1a6","frontmatter":{"title":"Webpack \"Invalid Host Header\"","description":"更新有风险，更新需谨慎……","tags":["webpack","dev","server","invalid","host"],"cover":{"publicURL":"/static/977bc2ebe23a9b6b10fdac4b470847b8/webpack-dev-server.jpg"},"series":"","draft":false,"original":true},"fields":{"id":"webpack-dev-server-invalid-host-header","slug":"/blog/2017/05/04/webpack-dev-server-invalid-host-header","type":"blog","date":"2017-05-04"}}},{"node":{"id":"0ab1e422-9e2e-585d-8aee-2273e0715029","frontmatter":{"title":"每天一点ES6(12)：Set 和 Map","description":"多余的，一概不要","tags":["ecmascript","2015","es6","javascript","map","set"],"cover":{"publicURL":"/static/0950334fb8899f1006423341cbfeecb9/es6daily.jpg"},"series":"es6daily","draft":false,"original":true},"fields":{"id":"es6-daily-12-set-and-map","slug":"/blog/2017/07/03/es6-daily-12-set-and-map","type":"blog","date":"2017-07-03"}}},{"node":{"id":"49b0f445-7cbd-5d20-86a3-dff801ff11ef","frontmatter":{"title":"Electron 安装出坑指南","description":"世界本无坑，用的人多了，也就有了坑","tags":["electron"],"cover":{"publicURL":"/static/a9838665d68ab68d327e48d8720bac3f/electron.jpg"},"series":"","draft":false,"original":true},"fields":{"id":"electron-install-guide","slug":"/blog/2017/07/06/electron-install-guide","type":"blog","date":"2017-07-06"}}},{"node":{"id":"af03b8b2-0679-5776-a6ee-2dcb39f7aec6","frontmatter":{"title":"ECMAScript 2017 正式到来","description":"ES 的世界开始日趋平静","tags":["ecmascript","2017","es8","javascript"],"cover":{"publicURL":"/static/77b7677386d27526bcb0b2687218f3f1/es2017.jpg"},"series":"ecmascript","draft":false,"original":true},"fields":{"id":"ecmascript-2017-is-here","slug":"/blog/2017/07/12/ecmascript-2017-is-here","type":"blog","date":"2017-07-12"}}},{"node":{"id":"1f254d7c-060e-52f9-af37-6824c1f0fe89","frontmatter":{"title":"童话说 V2.0 改版小结","description":"时隔多年，终于换新面貌了","tags":["blog","2.0","update"],"cover":{"publicURL":"/static/630ee6fc7ad1be564eebffb0e0dd447d/introducing-ths-v2.jpg"},"series":"","draft":false,"original":true},"fields":{"id":"introducing-ths-v2","slug":"/blog/2017/08/12/introducing-ths-v2","type":"blog","date":"2017-08-12"}}},{"node":{"id":"31e80902-e1a3-5bb7-a308-d7d01f260331","frontmatter":{"title":"TypeScript + Vue 踩坑纪实","description":"坑这种东西，多踩踩就平了","tags":["typescript","vue"],"cover":{"publicURL":"/static/fe6f5086d26293f21adf217a84141fd6/guide-for-vue-with-typescript.jpg"},"series":"","draft":false,"original":true},"fields":{"id":"guide-for-vue-with-typescript","slug":"/blog/2017/10/26/guide-for-vue-with-typescript","type":"blog","date":"2017-10-26"}}},{"node":{"id":"1dcfd3d2-d775-5454-815d-2f289e2088b3","frontmatter":{"title":"Node.js 9.0.0 发布","description":"一转眼，又半年过去了","tags":["nodejs","release"],"cover":{"publicURL":"/static/86f3115cebbb8dd82646ff1d231fa317/nodejs-9-release.jpg"},"series":"","draft":false,"original":true},"fields":{"id":"nodejs-9-release","slug":"/blog/2017/11/01/nodejs-9-release","type":"blog","date":"2017-11-01"}}},{"node":{"id":"479d9be7-97d4-5482-aab6-90a9b33052f9","frontmatter":{"title":"每天一点ES6(13)：Proxy 和 Reflect","description":"对不起，有代理真就是可以为所欲为","tags":["ecmascript","2015","es6","javascript","proxy","reflect"],"cover":{"publicURL":"/static/0950334fb8899f1006423341cbfeecb9/es6daily.jpg"},"series":"es6daily","draft":false,"original":true},"fields":{"id":"es6-daily-13-proxy-and-reflect","slug":"/blog/2017/12/20/es6-daily-13-proxy-and-reflect","type":"blog","date":"2017-12-20"}}},{"node":{"id":"ba0a8dc4-e229-5632-9024-5a19823848f4","frontmatter":{"title":"每天一点ES6(1)：概述","description":"伊艾斯6大法好，每天一点不会老！","tags":["ecmascript","2015","es6","javascript"],"cover":{"publicURL":"/static/0950334fb8899f1006423341cbfeecb9/es6daily.jpg"},"series":"es6daily","draft":false,"original":true},"fields":{"id":"es6-daily-01-intro","slug":"/blog/2016/01/24/es6-daily-01-intro","type":"blog","date":"2016-01-24"}}},{"node":{"id":"3d9678b9-4055-5296-8dad-32f261af39e3","frontmatter":{"title":"一个非著名前端开发者的 2017","description":"哎 ~ 又一年过去了","tags":["summary","2017","2018"],"cover":{"publicURL":"/static/0d96380257d25f6b398d9bc8e47af5a1/summary-2017.jpg"},"series":"summary","draft":false,"original":true},"fields":{"id":"summary-2017","slug":"/blog/2017/12/29/summary-2017","type":"blog","date":"2017-12-29"}}},{"node":{"id":"feaa4abe-dead-5b26-aafd-2ba664077e0a","frontmatter":{"title":"每天一点ES6(2)：let 和 const","description":"终于，JavaScript 也能用上块级作用域和常量了","tags":["ecmascript","2015","es6","javascript","let","const"],"cover":{"publicURL":"/static/0950334fb8899f1006423341cbfeecb9/es6daily.jpg"},"series":"es6daily","draft":false,"original":true},"fields":{"id":"es6-daily-02-let-and-const","slug":"/blog/2016/01/25/es6-daily-02-let-and-const","type":"blog","date":"2016-01-25"}}},{"node":{"id":"bad38d10-8840-5d4a-b8ee-7307eca7ff5f","frontmatter":{"title":"电梯调度算法","description":"上上下下的感受","tags":["elevator","algorithm","project"],"cover":{"publicURL":"/static/7b7f4cefe4c7bf293ff2cdb266af33d9/elevator.jpg"},"series":"","draft":false,"original":true},"fields":{"id":"elevator","slug":"/blog/2016/02/16/elevator","type":"blog","date":"2016-02-16"}}},{"node":{"id":"431e4dd2-8cc9-5f84-b84b-c4c1eabd3b09","frontmatter":{"title":"每天一点ES6(3)：解构赋值","description":"让你一次赋个够","tags":["ecmascript","2015","es6","javascript","destructuring"],"cover":{"publicURL":"/static/0950334fb8899f1006423341cbfeecb9/es6daily.jpg"},"series":"es6daily","draft":false,"original":true},"fields":{"id":"es6-daily-03-destructuring","slug":"/blog/2016/02/02/es6-daily-03-destructuring","type":"blog","date":"2016-02-02"}}},{"node":{"id":"78a4c0f1-f9a4-5abe-9fb0-fa0bdd0559f0","frontmatter":{"title":"每天一点ES6(4)：Babel","description":"《圣经》的光辉，永恒！","tags":["ecmascript","2015","es6","javascript","babel","npm"],"cover":{"publicURL":"/static/0950334fb8899f1006423341cbfeecb9/es6daily.jpg"},"series":"es6daily","draft":false,"original":true},"fields":{"id":"es6-daily-04-babel","slug":"/blog/2016/02/19/es6-daily-04-babel","type":"blog","date":"2016-02-19"}}},{"node":{"id":"d951db07-68df-59f9-9cee-c441a69a70e3","frontmatter":{"title":"每天一点ES6(5)：字符串的扩展","description":"不变的字符串现在更加多变了","tags":["ecmascript","2015","es6","javascript","string"],"cover":{"publicURL":"/static/0950334fb8899f1006423341cbfeecb9/es6daily.jpg"},"series":"es6daily","draft":false,"original":true},"fields":{"id":"es6-daily-05-string","slug":"/blog/2016/04/05/es6-daily-05-string","type":"blog","date":"2016-04-05"}}},{"node":{"id":"140d4f03-33ff-5c2f-bc34-f3db45e4af68","frontmatter":{"title":"每天一点ES6(6)：正则的扩展","description":"四字节 Unicode 的春天","tags":["ecmascript","2015","es6","javascript","regular","expression","regexp"],"cover":{"publicURL":"/static/0950334fb8899f1006423341cbfeecb9/es6daily.jpg"},"series":"es6daily","draft":false,"original":true},"fields":{"id":"es6-daily-06-regexp","slug":"/blog/2016/04/06/es6-daily-06-regexp","type":"blog","date":"2016-04-06"}}},{"node":{"id":"42c4dde9-d4c0-508a-bed0-070004ef8069","frontmatter":{"title":"每天一点ES6(7)：数值的扩展","description":"每一个数字都不能放过","tags":["ecmascript","2015","es6","javascript","number"],"cover":{"publicURL":"/static/0950334fb8899f1006423341cbfeecb9/es6daily.jpg"},"series":"es6daily","draft":false,"original":true},"fields":{"id":"es6-daily-07-number","slug":"/blog/2016/04/12/es6-daily-07-number","type":"blog","date":"2016-04-12"}}},{"node":{"id":"f9ed5267-cb6b-5bec-9610-b1e9f8e8ebc0","frontmatter":{"title":"每天一点ES6(8)：数组的扩展","description":"别拿语法糖不当干粮","tags":["ecmascript","2015","es6","javascript","array"],"cover":{"publicURL":"/static/0950334fb8899f1006423341cbfeecb9/es6daily.jpg"},"series":"es6daily","draft":false,"original":true},"fields":{"id":"es6-daily-08-array","slug":"/blog/2016/07/26/es6-daily-08-array","type":"blog","date":"2016-07-26"}}},{"node":{"id":"ab0b546a-515e-504e-92f2-5bc12544ed39","frontmatter":{"title":"每天一点ES6(9)：函数的扩展","description":"博采众长的实用语法糖","tags":["ecmascript","2015","es6","javascript","function"],"cover":{"publicURL":"/static/0950334fb8899f1006423341cbfeecb9/es6daily.jpg"},"series":"es6daily","draft":false,"original":true},"fields":{"id":"es6-daily-09-function","slug":"/blog/2016/12/20/es6-daily-09-function","type":"blog","date":"2016-12-20"}}},{"node":{"id":"4da7c54c-1654-5479-8d6b-ce27531ec6ea","frontmatter":{"title":"5 分钟彻底明白 JSONP","description":"说穿了，其实没那么难","tags":["javascript","jsonp"],"cover":{"publicURL":"/static/f8f2d118b15646398f7d00e19eb17ff9/jsonp.jpg"},"series":"","draft":false,"original":true},"fields":{"id":"jsonp","slug":"/blog/2016/08/17/jsonp","type":"blog","date":"2016-08-17"}}},{"node":{"id":"2b011eae-b89b-5d41-9cf1-15025c9a6117","frontmatter":{"title":"一个非著名前端开发者的 2016","description":"回顾 2016，是充实的一年，不负青春。2017 加油继续！","tags":["summary","2016","2017"],"cover":{"publicURL":"/static/d4bc85d6ff1aa8985e03c3875f90ea51/summary-2016.jpg"},"series":"summary","draft":false,"original":true},"fields":{"id":"summary-2016","slug":"/blog/2016/12/31/summary-2016","type":"blog","date":"2016-12-31"}}},{"node":{"id":"fa129fb7-cea0-54ef-97d9-2cd0e7dc435f","frontmatter":{"title":"栈计算器","description":"通过“栈”实现的方程式计算器","tags":["stack","calculator","algorithm","project"],"cover":{"publicURL":"/static/256bbf9439e7f58974c946bc16f54832/stack-calculator.jpg"},"series":"","draft":false,"original":true},"fields":{"id":"stack-calculator","slug":"/blog/2015/02/10/stack-calculator","type":"blog","date":"2015-02-10"}}},{"node":{"id":"481787e1-0e84-58ba-932e-7c6584b7ea7c","frontmatter":{"title":"时间是什么颜色的","description":"如果时间有颜色……","tags":["color","time","project"],"cover":{"publicURL":"/static/03c874556dd31d9db5f30b7609751b92/tik-tok-color.jpg"},"series":"","draft":false,"original":true},"fields":{"id":"tik-tok-color","slug":"/blog/2015/02/11/tik-tok-color","type":"blog","date":"2015-02-11"}}},{"node":{"id":"94f6b895-88ca-521e-8647-c0df5f922670","frontmatter":{"title":"使用 Sublime Text 编写 LaTeX","description":"用你最熟悉的工具来写 LaTeX 吧","tags":["sublime","latex"],"cover":{"publicURL":"/static/e7689b7e9fe6160a6ed614a10125ca29/latex-with-sublime-text.jpg"},"series":"","draft":false,"original":true},"fields":{"id":"latex-with-sublime-text","slug":"/blog/2015/04/01/latex-with-sublime-text","type":"blog","date":"2015-04-01"}}},{"node":{"id":"bb0d4469-c33f-5b65-9dce-b9eaa84033a7","frontmatter":{"title":"MIUI 图标缓存问题","description":"离奇失踪的图标","tags":["android","miui","icon","cache"],"cover":{"publicURL":"/static/2e66c31a61d5319c1849ea082e8c80ee/miui-icon-cache.jpg"},"series":"","draft":false,"original":true},"fields":{"id":"miui-icon-cache","slug":"/blog/2015/04/18/miui-icon-cache","type":"blog","date":"2015-04-18"}}},{"node":{"id":"eae3570c-3509-5e64-bd53-a1ce138da4e5","frontmatter":{"title":"纯 CSS3 绘制月饼","description":"中秋佳节，用CSS3来画个月饼吧","tags":["css","mooncake","project"],"cover":{"publicURL":"/static/9aaefaae86216c79623893c080f1ccc2/css3-mooncake.jpg"},"series":"","draft":false,"original":true},"fields":{"id":"css3-mooncake","slug":"/blog/2015/09/27/css3-mooncake","type":"blog","date":"2015-09-27"}}},{"node":{"id":"b1595fb6-f219-5181-8272-64ed2e1efd07","frontmatter":{"title":"substr() 和 substring() 的区别","description":"两个函数，傻傻分不清楚","tags":["javascript","substr","substring","slice"],"cover":{"publicURL":"/static/289ad52fc38963e15549cd1dc24678e4/substring.jpg"},"series":"","draft":false,"original":true},"fields":{"id":"substr-and-substring","slug":"/blog/2015/05/15/substr-and-substring","type":"blog","date":"2015-05-15"}}}]},"markdownRemark":{"id":"431e4dd2-8cc9-5f84-b84b-c4c1eabd3b09","html":"<h2>什么叫解构</h2>\n<p>所谓 <strong>解构（Destructuring）</strong> ，就是把数组或对象打散为一堆变量。</p>\n<p>解构是 <strong>构造（Constructuring）</strong> 的逆过程，想象一下我们熟悉的构造函数，其实就是把一堆变量组合成一个对象或数组。</p>\n<p>而 <strong>解构赋值</strong> ，就是把解构的结果赋值给其它的变量，这个过程通常是多对多的，看上去就像是把一个数组或对象直接赋值给另一个数组或对象一样。（然而这并不表示对象和数组可以直接赋值，只是看着像而已）</p>\n<h2>数组的解构赋值</h2>\n<p>ES6 支持对数组进行解构赋值，它会根据索引顺序进行模式匹配，写法如下。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"gatsby-code-js line-numbers\"><code class=\"gatsby-code-js\"><span class=\"token keyword\">var</span> <span class=\"token punctuation\">[</span>a<span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">,</span> c<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">var</span> a <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> b <span class=\"token operator\">=</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> c <span class=\"token operator\">=</span> <span class=\"token number\">3</span><span class=\"token punctuation\">;</span>    <span class=\"token comment\">// 上面的代码等价于这行代码</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span></span></pre></div>\n<p>数组的解构赋值根据索引顺序一一对应，如果左边变量的索引在右边的数组中存在，则将右边该索引位置的值赋给左边的变量，如果右边数组中没有对应的索引，则该索引位置的解构失败，左边的变量赋值为undefined（或使用默认值，后面会讲到）。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"gatsby-code-js line-numbers\"><code class=\"gatsby-code-js\"><span class=\"token comment\">// 右边比左边少，空缺位解构失败</span>\n<span class=\"token keyword\">let</span> <span class=\"token punctuation\">[</span>foo<span class=\"token punctuation\">]</span>       <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>                <span class=\"token comment\">// foo: undefined</span>\n<span class=\"token keyword\">let</span> <span class=\"token punctuation\">[</span>bar<span class=\"token punctuation\">,</span> foo<span class=\"token punctuation\">]</span>  <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>               <span class=\"token comment\">// foo: undefined</span>\n\n<span class=\"token comment\">// 右边比左边多，多余部分舍去</span>\n<span class=\"token keyword\">let</span> <span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">]</span>      <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>         <span class=\"token comment\">// x:1, y:2</span>\n<span class=\"token keyword\">let</span> <span class=\"token punctuation\">[</span>a<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span>b<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> d<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>    <span class=\"token comment\">// a:1, b:2, d:4</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>数组的解构赋值要求等号右边必须是数组（ES6引入了Iterator接口的概念，因此这里严格说来是指等号右边必须是可遍历的结构），否则报错。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"gatsby-code-js line-numbers\"><code class=\"gatsby-code-js\"><span class=\"token comment\">// 原始变量的包装对象不具备Iterator接口</span>\n<span class=\"token keyword\">let</span> <span class=\"token punctuation\">[</span>foo<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">let</span> <span class=\"token punctuation\">[</span>foo<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">let</span> <span class=\"token punctuation\">[</span>foo<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token number\">NaN</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">let</span> <span class=\"token punctuation\">[</span>foo<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">undefined</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">let</span> <span class=\"token punctuation\">[</span>foo<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 空对象不具备Iterator接口</span>\n<span class=\"token keyword\">let</span> <span class=\"token punctuation\">[</span>foo<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Set是ES6引入的集合类，具备Iterator接口，可以用于解构赋值</span>\n<span class=\"token keyword\">let</span> <span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">,</span> z<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Set</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token string\">\"a\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"b\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"c\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>    <span class=\"token comment\">// x: \"a\"</span>\n\n<span class=\"token comment\">// Generator是ES6引入的函数类型，具备Iterator接口，可以用于解构赋值</span>\n<span class=\"token comment\">// yield在Generator中相当于return，后续文章会详细说明。</span>\n<span class=\"token keyword\">function</span><span class=\"token operator\">*</span> <span class=\"token function\">fibs</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">var</span> a <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> b <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span><span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">yield</span> a<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">[</span>a<span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>b<span class=\"token punctuation\">,</span> a <span class=\"token operator\">+</span> b<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>    <span class=\"token comment\">// 函数内部的解构赋值。</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">let</span> <span class=\"token punctuation\">[</span>first<span class=\"token punctuation\">,</span> second<span class=\"token punctuation\">,</span> third<span class=\"token punctuation\">,</span> fourth<span class=\"token punctuation\">,</span> fifth<span class=\"token punctuation\">,</span> sixth<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">fibs</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>    <span class=\"token comment\">// sixth: 5</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>在之前的代码中，解构赋值通常都和 <code class=\"gatsby-code-text\">let</code> 一起出现，但解构赋值和变量声明其实是两个独立的操作，我们只是将解构的结果直接用于新变量的初始化了而已。无论是 <code class=\"gatsby-code-text\">var</code> 、 <code class=\"gatsby-code-text\">let</code> 、 <code class=\"gatsby-code-text\">const</code> 都可以使用，如果变量已经存在就不需要用到它们。</p>\n<h3>嵌套</h3>\n<p>数组的解构赋值支持嵌套，只要等号两边对应位置的结构相同即可。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"gatsby-code-js line-numbers\"><code class=\"gatsby-code-js\"><span class=\"token keyword\">let</span> <span class=\"token punctuation\">[</span>foo<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">[</span>bar<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> baz<span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>     <span class=\"token comment\">// foo:1, bar:2, baz:3</span>\n\n<span class=\"token comment\">// 左边有空缺不要紧，空缺位会自动跳过</span>\n<span class=\"token keyword\">let</span> <span class=\"token punctuation\">[</span> <span class=\"token punctuation\">,</span> <span class=\"token punctuation\">,</span> third<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"foo\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"bar\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"baz\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>    <span class=\"token comment\">// third:\"baz\"</span>\n<span class=\"token keyword\">let</span> <span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">]</span>     <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>                <span class=\"token comment\">// x:1, y:3</span>\n\n<span class=\"token comment\">// \"...x\"是ES6新增的语法糖“剩余参数”，后续文章会详细说明。</span>\n<span class=\"token keyword\">let</span> <span class=\"token punctuation\">[</span>head<span class=\"token punctuation\">,</span> <span class=\"token operator\">...</span>tail<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>          <span class=\"token comment\">// head:1, tail:[2, 3, 4]</span>\n<span class=\"token keyword\">let</span> <span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">,</span> <span class=\"token operator\">...</span>z<span class=\"token punctuation\">]</span>    <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'a'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>                 <span class=\"token comment\">// x:'a', y:undefined, z:[]</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<h3>默认值</h3>\n<p>解构赋值可以设置默认值。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"gatsby-code-js line-numbers\"><code class=\"gatsby-code-js\"><span class=\"token keyword\">var</span> <span class=\"token punctuation\">[</span>foo <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>                 <span class=\"token comment\">// foo: true</span>\n\n<span class=\"token keyword\">var</span> <span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">,</span> y <span class=\"token operator\">=</span> <span class=\"token string\">'b'</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'a'</span><span class=\"token punctuation\">]</span>               <span class=\"token comment\">// x:'a', y:'b'</span>\n<span class=\"token keyword\">var</span> <span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">,</span> y <span class=\"token operator\">=</span> <span class=\"token string\">'b'</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'a'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">undefined</span><span class=\"token punctuation\">]</span>    <span class=\"token comment\">// x:'a', y:'b'</span>\n\n<span class=\"token comment\">// 仅当等号右边的元素是undefined时，默认值才起效</span>\n<span class=\"token keyword\">var</span> <span class=\"token punctuation\">[</span>x <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token keyword\">undefined</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>             <span class=\"token comment\">// x:1</span>\n<span class=\"token keyword\">var</span> <span class=\"token punctuation\">[</span>x <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token keyword\">null</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>                  <span class=\"token comment\">// x:null</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">f</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'aaa'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">let</span> <span class=\"token punctuation\">[</span>x <span class=\"token operator\">=</span> <span class=\"token function\">f</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>                   <span class=\"token comment\">// 右边不等于undefined，因此f()不会调用。x：1</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>默认值可以引用解构赋值的其他变量，但该变量必须已经声明。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"gatsby-code-js line-numbers\"><code class=\"gatsby-code-js\"><span class=\"token keyword\">let</span> <span class=\"token punctuation\">[</span>x <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> y <span class=\"token operator\">=</span> x<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>     <span class=\"token comment\">// x:1, y:1</span>\n<span class=\"token keyword\">let</span> <span class=\"token punctuation\">[</span>x <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> y <span class=\"token operator\">=</span> x<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>    <span class=\"token comment\">// x:2, y:2</span>\n<span class=\"token keyword\">let</span> <span class=\"token punctuation\">[</span>x <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> y <span class=\"token operator\">=</span> x<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// x:2, y:3</span>\n<span class=\"token keyword\">let</span> <span class=\"token punctuation\">[</span>x <span class=\"token operator\">=</span> y<span class=\"token punctuation\">,</span> y <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>     <span class=\"token comment\">// ReferenceError，x引用y的值时，y还没声明</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span></span></pre></div>\n<h2>对象的解构赋值</h2>\n<p>解构赋值也可以用于对象，区别在于对象的解构根据属性名进行映射，与顺序无关。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"gatsby-code-js line-numbers\"><code class=\"gatsby-code-js\"><span class=\"token keyword\">var</span> <span class=\"token punctuation\">{</span> bar<span class=\"token punctuation\">,</span> foo <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> foo<span class=\"token operator\">:</span> <span class=\"token string\">\"aaa\"</span><span class=\"token punctuation\">,</span> bar<span class=\"token operator\">:</span> <span class=\"token string\">\"bbb\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>    <span class=\"token comment\">// foo:\"aaa\", bar:\"bbb\"</span>\n<span class=\"token keyword\">var</span> <span class=\"token punctuation\">{</span> baz <span class=\"token punctuation\">}</span>      <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> foo<span class=\"token operator\">:</span> <span class=\"token string\">\"aaa\"</span><span class=\"token punctuation\">,</span> bar<span class=\"token operator\">:</span> <span class=\"token string\">\"bbb\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>    <span class=\"token comment\">// baz:undefined</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span></span></pre></div>\n<p>对象解构赋值的内部机制，是先找到同名属性，然后用等号右边的属性值给左边对应的属性值赋值。真正被赋值的是冒号右边的属性值，而不是左边的属性名。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"gatsby-code-js line-numbers\"><code class=\"gatsby-code-js\"><span class=\"token keyword\">var</span> <span class=\"token punctuation\">{</span> foo<span class=\"token operator\">:</span> baz <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> foo<span class=\"token operator\">:</span> <span class=\"token string\">\"aaa\"</span><span class=\"token punctuation\">,</span> bar<span class=\"token operator\">:</span> <span class=\"token string\">\"bbb\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>    <span class=\"token comment\">// baz:\"aaa\", foo:not defined</span>\n\n<span class=\"token keyword\">let</span> obj <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> first<span class=\"token operator\">:</span> <span class=\"token string\">'hello'</span><span class=\"token punctuation\">,</span> last<span class=\"token operator\">:</span> <span class=\"token string\">'world'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">let</span> <span class=\"token punctuation\">{</span> first<span class=\"token operator\">:</span> f<span class=\"token punctuation\">,</span> last<span class=\"token operator\">:</span> l <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> obj<span class=\"token punctuation\">;</span>                  <span class=\"token comment\">// f:'hello', l:'world'</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span></span></pre></div>\n<p>对象的解构赋值其实是下面形式的简写。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"gatsby-code-js line-numbers\"><code class=\"gatsby-code-js\"><span class=\"token keyword\">var</span> <span class=\"token punctuation\">{</span> foo<span class=\"token operator\">:</span> foo<span class=\"token punctuation\">,</span> bar<span class=\"token operator\">:</span> bar <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> foo<span class=\"token operator\">:</span> <span class=\"token string\">\"aaa\"</span><span class=\"token punctuation\">,</span> bar<span class=\"token operator\">:</span> <span class=\"token string\">\"bbb\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>    <span class=\"token comment\">// 完整形式</span>\n<span class=\"token keyword\">var</span> <span class=\"token punctuation\">{</span> foo     <span class=\"token punctuation\">,</span> bar      <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> foo<span class=\"token operator\">:</span> <span class=\"token string\">\"aaa\"</span><span class=\"token punctuation\">,</span> bar<span class=\"token operator\">:</span> <span class=\"token string\">\"bbb\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>    <span class=\"token comment\">// 简写形式</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span></span></pre></div>\n<h3>嵌套</h3>\n<p>对象的解构赋值同样支持嵌套，并且可以和数组混合嵌套。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"gatsby-code-js line-numbers\"><code class=\"gatsby-code-js\"><span class=\"token keyword\">var</span> obj <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  p<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n    <span class=\"token string\">\"Hello\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">{</span> y<span class=\"token operator\">:</span> <span class=\"token string\">\"World\"</span> <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">var</span> <span class=\"token punctuation\">{</span> p<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> y <span class=\"token punctuation\">}</span><span class=\"token punctuation\">]</span> <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> obj<span class=\"token punctuation\">;</span>    <span class=\"token comment\">// x:\"Hello\", y:\"World\", p是属性名，不参与赋值</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<h3>默认值</h3>\n<p>对象的解构赋值同样支持默认值。默认值仅当右边找不到同名属性，或同名属性值为undefined时起效</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"gatsby-code-js line-numbers\"><code class=\"gatsby-code-js\"><span class=\"token keyword\">var</span> <span class=\"token punctuation\">{</span>x<span class=\"token punctuation\">,</span> y <span class=\"token operator\">=</span> <span class=\"token number\">5</span><span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>x<span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>        <span class=\"token comment\">// x:1, y:5</span>\n\n<span class=\"token keyword\">var</span> <span class=\"token punctuation\">{</span>x <span class=\"token operator\">=</span> <span class=\"token number\">3</span><span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>x<span class=\"token operator\">:</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>        <span class=\"token comment\">// x:null</span>\n<span class=\"token keyword\">var</span> <span class=\"token punctuation\">{</span>x <span class=\"token operator\">=</span> <span class=\"token number\">3</span><span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>x<span class=\"token operator\">:</span> <span class=\"token keyword\">undefined</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>   <span class=\"token comment\">// x:3</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span></span></pre></div>\n<p>如果左边的属性在右边没有同名属性，又没有指定默认值，则解构失败，值为undefined</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"gatsby-code-js line-numbers\"><code class=\"gatsby-code-js\"><span class=\"token keyword\">var</span> <span class=\"token punctuation\">{</span>foo<span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>bar<span class=\"token operator\">:</span> <span class=\"token string\">'baz'</span><span class=\"token punctuation\">}</span>    <span class=\"token comment\">// foo:undefined</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<p>如果解构模式是嵌套的对象，子对象所属的父属性不存在，则即便右边同名属性的值不是undefined，也依旧会报错。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"gatsby-code-js line-numbers\"><code class=\"gatsby-code-js\"><span class=\"token keyword\">var</span> <span class=\"token punctuation\">{</span>foo<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>bar<span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>baz<span class=\"token operator\">:</span> <span class=\"token string\">'baz'</span><span class=\"token punctuation\">}</span>    <span class=\"token comment\">// Error</span>\n\n<span class=\"token keyword\">var</span> _tmp <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>baz<span class=\"token operator\">:</span> <span class=\"token string\">'baz'</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n_tmp<span class=\"token punctuation\">.</span>foo<span class=\"token punctuation\">.</span>bar <span class=\"token comment\">// 报错，foo属性值为undefined，再取子属性自然报错。</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span></span></pre></div>\n<p>如果要将一个已经声明的变量用于解构赋值，必须用括号包裹，不能让花括号处于行首。例如下面的代码，JS引擎会把 <code class=\"gatsby-code-text\">{x}</code> 理解为一个代码段，进而导致语法错误。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"gatsby-code-js line-numbers\"><code class=\"gatsby-code-js\"><span class=\"token keyword\">var</span> x<span class=\"token punctuation\">;</span>\n <span class=\"token punctuation\">{</span>x<span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>x<span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>     <span class=\"token comment\">// 语法错误</span>\n<span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>x<span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>x<span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>    <span class=\"token comment\">// 正确的写法</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span></span></pre></div>\n<p>解构赋值允许等号左边为空。下面的代码虽然毫无意义，但在语法上却是合法的。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"gatsby-code-js line-numbers\"><code class=\"gatsby-code-js\"><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token string\">'abc'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span></span></pre></div>\n<p>利用对象的解构赋值，可以很方便地将现有对象的方法，赋值到某个变量。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"gatsby-code-js line-numbers\"><code class=\"gatsby-code-js\"><span class=\"token keyword\">let</span> <span class=\"token punctuation\">{</span> log<span class=\"token punctuation\">,</span> sin<span class=\"token punctuation\">,</span> cos <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> Math<span class=\"token punctuation\">;</span>    <span class=\"token comment\">// Math类中包含了这几个方法，该操作将这几个方法提取出来</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<h2>字符串的解构赋值</h2>\n<p>字符串作为类数组对象，同时具备了数组和对象的特性，因此可以用两种方式进行解构赋值。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"gatsby-code-js line-numbers\"><code class=\"gatsby-code-js\"><span class=\"token comment\">// 字符串可以看做数组进行结构</span>\n<span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>a<span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">,</span> c<span class=\"token punctuation\">,</span> d<span class=\"token punctuation\">,</span> e<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token string\">'hello'</span><span class=\"token punctuation\">;</span>    <span class=\"token comment\">// a:\"h\", b:\"e\", c:\"l\", d:\"l\", e:\"o\",</span>\n\n<span class=\"token comment\">// 字符串作为类数组对象，拥有length属性。</span>\n<span class=\"token keyword\">let</span> <span class=\"token punctuation\">{</span>length <span class=\"token operator\">:</span> len<span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token string\">'hello'</span><span class=\"token punctuation\">;</span>       <span class=\"token comment\">// len:5</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<h2>数值和布尔值的解构赋值</h2>\n<p>数值和布尔值也能进行解构，两者会先转为对象，剩下的就是匹配对象中的方法</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"gatsby-code-js line-numbers\"><code class=\"gatsby-code-js\"><span class=\"token keyword\">let</span> <span class=\"token punctuation\">{</span>toString<span class=\"token operator\">:</span> s<span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token number\">123</span><span class=\"token punctuation\">;</span>\ns <span class=\"token operator\">===</span> <span class=\"token class-name\">Number</span><span class=\"token punctuation\">.</span>prototype<span class=\"token punctuation\">.</span>toString  <span class=\"token comment\">// true</span>\n\n<span class=\"token keyword\">let</span> <span class=\"token punctuation\">{</span>toString<span class=\"token operator\">:</span> s<span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\ns <span class=\"token operator\">===</span> <span class=\"token class-name\">Boolean</span><span class=\"token punctuation\">.</span>prototype<span class=\"token punctuation\">.</span>toString <span class=\"token comment\">// true</span>\n\n<span class=\"token comment\">// undefined和null不能转为对象，没有属性</span>\n<span class=\"token keyword\">let</span> <span class=\"token punctuation\">{</span> prop<span class=\"token operator\">:</span> x <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">undefined</span><span class=\"token punctuation\">;</span>     <span class=\"token comment\">// TypeError</span>\n<span class=\"token keyword\">let</span> <span class=\"token punctuation\">{</span> prop<span class=\"token operator\">:</span> y <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>          <span class=\"token comment\">// TypeError</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<h2>函数参数的解构赋值</h2>\n<p>函数的参数也可以使用解构赋值。下面的代码中， <code class=\"gatsby-code-text\">add()</code> 的参数不是数组，而是 <code class=\"gatsby-code-text\">[x,y] = [1,2]</code> 的解构，在函数内部，x和y可以直接访问，不需要索引。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"gatsby-code-js line-numbers\"><code class=\"gatsby-code-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">]</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> x <span class=\"token operator\">+</span> y<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// 3</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>函数参数的解构也可以使用默认值。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"gatsby-code-js line-numbers\"><code class=\"gatsby-code-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">move</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span>x <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> y <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token function\">move</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>x<span class=\"token operator\">:</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> y<span class=\"token operator\">:</span> <span class=\"token number\">8</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// [3, 8]</span>\n<span class=\"token function\">move</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>x<span class=\"token operator\">:</span> <span class=\"token number\">3</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>       <span class=\"token comment\">// [3, 0]，y使用默认值</span>\n<span class=\"token function\">move</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>           <span class=\"token comment\">// [0, 0]，空对象，x、y均使用默认值</span>\n<span class=\"token function\">move</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>             <span class=\"token comment\">// [0, 0]，无参调用，x、y均使用默认值</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>注意，下面的写法不是解构赋值，而是给函数的参数设定默认值，只有在无参调用时默认值才起效。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"gatsby-code-js line-numbers\"><code class=\"gatsby-code-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">move</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> x<span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> y<span class=\"token operator\">:</span> <span class=\"token number\">0</span> <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token function\">move</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>x<span class=\"token operator\">:</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> y<span class=\"token operator\">:</span> <span class=\"token number\">8</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// [        3,         8]</span>\n<span class=\"token function\">move</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>x<span class=\"token operator\">:</span> <span class=\"token number\">3</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>       <span class=\"token comment\">// [        3, undefined]，x正常赋值，默认值无效，y属性不存在，因此是undefined</span>\n<span class=\"token function\">move</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>           <span class=\"token comment\">// [undefined, undefined]，空对象也是实参，默认值无效，x、y属性都不存在，都是undefined</span>\n<span class=\"token function\">move</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>             <span class=\"token comment\">// [        0,         0]，无参调用，默认值起效</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<h2>圆括号问题</h2>\n<p>对编译器而言，一个式子到底是模式，还是表达式，只有解析到（或解析不到）等号才能知道，因此会导致一些歧义。ES6 规定，但凡有可能产生歧义，就不能使用圆括号。以下3种情况下不能用圆括号：</p>\n<h3>1. 变量声明语句中，模式不能带有圆括号</h3>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"gatsby-code-js line-numbers\"><code class=\"gatsby-code-js\"><span class=\"token comment\">// 下面3中写法都会报错</span>\n<span class=\"token keyword\">var</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">(</span>a<span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">var</span> <span class=\"token punctuation\">{</span> x<span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span>c<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">var</span> <span class=\"token punctuation\">{</span> o<span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> p<span class=\"token operator\">:</span> p <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> o<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> p<span class=\"token operator\">:</span> <span class=\"token number\">2</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span></span></pre></div>\n<h3>2. 函数参数中，模式不能带有圆括号</h3>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"gatsby-code-js line-numbers\"><code class=\"gatsby-code-js\"><span class=\"token comment\">// 函数参数也属于变量声明，因此不能带有圆括号</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">f</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">[</span><span class=\"token punctuation\">(</span>z<span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token keyword\">return</span> z<span class=\"token punctuation\">;</span> <span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span></span></pre></div>\n<h3>3. 不能将整个模式，或嵌套模式中的一层，放在圆括号之中。</h3>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"gatsby-code-js line-numbers\"><code class=\"gatsby-code-js\"><span class=\"token comment\">// 将整个模式放在圆括号之中，会报错</span>\n<span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> p<span class=\"token operator\">:</span> a <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> p<span class=\"token operator\">:</span> <span class=\"token number\">42</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>a<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">5</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 将嵌套模式的一层放在圆括号之中，会报错。</span>\n<span class=\"token punctuation\">[</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> p<span class=\"token operator\">:</span> a <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> x<span class=\"token operator\">:</span> c <span class=\"token punctuation\">}</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>只有一种情况可以使用圆括号：赋值语句的非模式部分。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"gatsby-code-js line-numbers\"><code class=\"gatsby-code-js\"><span class=\"token punctuation\">[</span><span class=\"token punctuation\">(</span>b<span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>               <span class=\"token comment\">// 正确，数组的解构赋值根据索引来，与括号无关</span>\n<span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> p<span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span>d<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>         <span class=\"token comment\">// 正确，p是模式，但d不是模式。</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span></span></pre></div>\n<h2>用途</h2>\n<h3>1. 交换变量的值</h3>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"gatsby-code-js line-numbers\"><code class=\"gatsby-code-js\"><span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>y<span class=\"token punctuation\">,</span> x<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<h3>2. 从函数返回多个值</h3>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"gatsby-code-js line-numbers\"><code class=\"gatsby-code-js\"><span class=\"token comment\">// 返回一个数组</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">example</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token keyword\">return</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span> <span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">var</span> <span class=\"token punctuation\">[</span>a<span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">,</span> c<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">example</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 返回一个对象</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">example</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span> foo<span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> bar<span class=\"token operator\">:</span> <span class=\"token number\">2</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span> <span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">var</span> <span class=\"token punctuation\">{</span> foo<span class=\"token punctuation\">,</span> bar <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token function\">example</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<h3>3. 函数参数的定义</h3>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"gatsby-code-js line-numbers\"><code class=\"gatsby-code-js\"><span class=\"token comment\">// 参数是一组有次序的值</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">f</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">,</span> z<span class=\"token punctuation\">]</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token operator\">...</span> <span class=\"token punctuation\">}</span>\n<span class=\"token function\">f</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">// 参数是一组无次序的值</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">f</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">,</span> z<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token operator\">...</span> <span class=\"token punctuation\">}</span>\n<span class=\"token function\">f</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>z<span class=\"token operator\">:</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> y<span class=\"token operator\">:</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> x<span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<h3>4. 函数参数的默认值</h3>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"gatsby-code-js line-numbers\"><code class=\"gatsby-code-js\"><span class=\"token comment\">// bar, baz 等参数如果不指定，就用默认值代替，本质是对象的解构赋值</span>\n<span class=\"token comment\">// 避免了在函数体内再写 var bar = config.bar || true 等检测代码</span>\n<span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span>foo<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n  bar <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n  <span class=\"token function-variable function\">baz</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token operator\">...</span><span class=\"token operator\">...</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// do something</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<h3>5. 提取JSON数据</h3>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"gatsby-code-js line-numbers\"><code class=\"gatsby-code-js\"><span class=\"token keyword\">var</span> jsonData <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  id<span class=\"token operator\">:</span> <span class=\"token number\">42</span><span class=\"token punctuation\">,</span>\n  status<span class=\"token operator\">:</span> <span class=\"token string\">\"OK\"</span><span class=\"token punctuation\">,</span>\n  data<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token number\">867</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5309</span><span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">let</span> <span class=\"token punctuation\">{</span> id<span class=\"token punctuation\">,</span> status<span class=\"token punctuation\">,</span> data<span class=\"token operator\">:</span> number <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> jsonData<span class=\"token punctuation\">;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">,</span> status<span class=\"token punctuation\">,</span> number<span class=\"token punctuation\">)</span>    <span class=\"token comment\">// 42, OK, [867, 5309]</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<h3>6. 遍历Map</h3>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"gatsby-code-js line-numbers\"><code class=\"gatsby-code-js\"><span class=\"token comment\">// Map 类型是 ES6 引入的集合类型，以键值对方式存储数据。后续文章会详细说明</span>\n<span class=\"token keyword\">var</span> map <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Map</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nmap<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span><span class=\"token string\">'first'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'hello'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nmap<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span><span class=\"token string\">'second'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'world'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// for...of 是 ES6 引入的循环方式，类似 for...in，后续文章会详细说明</span>\n<span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> <span class=\"token punctuation\">[</span>key<span class=\"token punctuation\">,</span> value<span class=\"token punctuation\">]</span> <span class=\"token keyword\">of</span> map<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>key <span class=\"token operator\">+</span> <span class=\"token string\">\" is \"</span> <span class=\"token operator\">+</span> value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token comment\">// first is hello</span>\n<span class=\"token comment\">// second is world</span>\n\n<span class=\"token comment\">// 也可以单独获取键，或者值</span>\n<span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> <span class=\"token punctuation\">[</span>key<span class=\"token punctuation\">]</span>     <span class=\"token keyword\">of</span> map<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token operator\">...</span> <span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">,</span> value<span class=\"token punctuation\">]</span> <span class=\"token keyword\">of</span> map<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token operator\">...</span> <span class=\"token punctuation\">}</span>    <span class=\"token comment\">// 注意逗号不能省，这是数组的解构赋值</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<h3>7. 输入模块的指定方法</h3>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"gatsby-code-js line-numbers\"><code class=\"gatsby-code-js\"><span class=\"token comment\">// 加载模块时，往往需要指定输入哪些方法。解构赋值使得输入语句非常清晰。</span>\n<span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> SourceMapConsumer<span class=\"token punctuation\">,</span> SourceNode <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"source-map\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span></span></pre></div>","frontmatter":{"title":"每天一点ES6(3)：解构赋值","description":"让你一次赋个够","cover":{"publicURL":"/static/0950334fb8899f1006423341cbfeecb9/es6daily.jpg"},"tags":["ecmascript","2015","es6","javascript","destructuring"],"series":"es6daily","draft":false},"fields":{"id":"es6-daily-03-destructuring","date":"2016-02-02"},"headings":[{"value":"什么叫解构","depth":2},{"value":"数组的解构赋值","depth":2},{"value":"嵌套","depth":3},{"value":"默认值","depth":3},{"value":"对象的解构赋值","depth":2},{"value":"嵌套","depth":3},{"value":"默认值","depth":3},{"value":"字符串的解构赋值","depth":2},{"value":"数值和布尔值的解构赋值","depth":2},{"value":"函数参数的解构赋值","depth":2},{"value":"圆括号问题","depth":2},{"value":"1. 变量声明语句中，模式不能带有圆括号","depth":3},{"value":"2. 函数参数中，模式不能带有圆括号","depth":3},{"value":"3. 不能将整个模式，或嵌套模式中的一层，放在圆括号之中。","depth":3},{"value":"用途","depth":2},{"value":"1. 交换变量的值","depth":3},{"value":"2. 从函数返回多个值","depth":3},{"value":"3. 函数参数的定义","depth":3},{"value":"4. 函数参数的默认值","depth":3},{"value":"5. 提取JSON数据","depth":3},{"value":"6. 遍历Map","depth":3},{"value":"7. 输入模块的指定方法","depth":3}],"tableOfContents":"<ul>\n<li><a href=\"/blog/2016/02/02/es6-daily-03-destructuring/#%E4%BB%80%E4%B9%88%E5%8F%AB%E8%A7%A3%E6%9E%84\">什么叫解构</a></li>\n<li>\n<p><a href=\"/blog/2016/02/02/es6-daily-03-destructuring/#%E6%95%B0%E7%BB%84%E7%9A%84%E8%A7%A3%E6%9E%84%E8%B5%8B%E5%80%BC\">数组的解构赋值</a></p>\n<ul>\n<li><a href=\"/blog/2016/02/02/es6-daily-03-destructuring/#%E5%B5%8C%E5%A5%97\">嵌套</a></li>\n<li><a href=\"/blog/2016/02/02/es6-daily-03-destructuring/#%E9%BB%98%E8%AE%A4%E5%80%BC\">默认值</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/blog/2016/02/02/es6-daily-03-destructuring/#%E5%AF%B9%E8%B1%A1%E7%9A%84%E8%A7%A3%E6%9E%84%E8%B5%8B%E5%80%BC\">对象的解构赋值</a></p>\n<ul>\n<li><a href=\"/blog/2016/02/02/es6-daily-03-destructuring/#%E5%B5%8C%E5%A5%97-1\">嵌套</a></li>\n<li><a href=\"/blog/2016/02/02/es6-daily-03-destructuring/#%E9%BB%98%E8%AE%A4%E5%80%BC-1\">默认值</a></li>\n</ul>\n</li>\n<li><a href=\"/blog/2016/02/02/es6-daily-03-destructuring/#%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E8%A7%A3%E6%9E%84%E8%B5%8B%E5%80%BC\">字符串的解构赋值</a></li>\n<li><a href=\"/blog/2016/02/02/es6-daily-03-destructuring/#%E6%95%B0%E5%80%BC%E5%92%8C%E5%B8%83%E5%B0%94%E5%80%BC%E7%9A%84%E8%A7%A3%E6%9E%84%E8%B5%8B%E5%80%BC\">数值和布尔值的解构赋值</a></li>\n<li><a href=\"/blog/2016/02/02/es6-daily-03-destructuring/#%E5%87%BD%E6%95%B0%E5%8F%82%E6%95%B0%E7%9A%84%E8%A7%A3%E6%9E%84%E8%B5%8B%E5%80%BC\">函数参数的解构赋值</a></li>\n<li>\n<p><a href=\"/blog/2016/02/02/es6-daily-03-destructuring/#%E5%9C%86%E6%8B%AC%E5%8F%B7%E9%97%AE%E9%A2%98\">圆括号问题</a></p>\n<ul>\n<li><a href=\"/blog/2016/02/02/es6-daily-03-destructuring/#1-%E5%8F%98%E9%87%8F%E5%A3%B0%E6%98%8E%E8%AF%AD%E5%8F%A5%E4%B8%AD%EF%BC%8C%E6%A8%A1%E5%BC%8F%E4%B8%8D%E8%83%BD%E5%B8%A6%E6%9C%89%E5%9C%86%E6%8B%AC%E5%8F%B7\">1. 变量声明语句中，模式不能带有圆括号</a></li>\n<li><a href=\"/blog/2016/02/02/es6-daily-03-destructuring/#2-%E5%87%BD%E6%95%B0%E5%8F%82%E6%95%B0%E4%B8%AD%EF%BC%8C%E6%A8%A1%E5%BC%8F%E4%B8%8D%E8%83%BD%E5%B8%A6%E6%9C%89%E5%9C%86%E6%8B%AC%E5%8F%B7\">2. 函数参数中，模式不能带有圆括号</a></li>\n<li><a href=\"/blog/2016/02/02/es6-daily-03-destructuring/#3-%E4%B8%8D%E8%83%BD%E5%B0%86%E6%95%B4%E4%B8%AA%E6%A8%A1%E5%BC%8F%EF%BC%8C%E6%88%96%E5%B5%8C%E5%A5%97%E6%A8%A1%E5%BC%8F%E4%B8%AD%E7%9A%84%E4%B8%80%E5%B1%82%EF%BC%8C%E6%94%BE%E5%9C%A8%E5%9C%86%E6%8B%AC%E5%8F%B7%E4%B9%8B%E4%B8%AD%E3%80%82\">3. 不能将整个模式，或嵌套模式中的一层，放在圆括号之中。</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/blog/2016/02/02/es6-daily-03-destructuring/#%E7%94%A8%E9%80%94\">用途</a></p>\n<ul>\n<li><a href=\"/blog/2016/02/02/es6-daily-03-destructuring/#1-%E4%BA%A4%E6%8D%A2%E5%8F%98%E9%87%8F%E7%9A%84%E5%80%BC\">1. 交换变量的值</a></li>\n<li><a href=\"/blog/2016/02/02/es6-daily-03-destructuring/#2-%E4%BB%8E%E5%87%BD%E6%95%B0%E8%BF%94%E5%9B%9E%E5%A4%9A%E4%B8%AA%E5%80%BC\">2. 从函数返回多个值</a></li>\n<li><a href=\"/blog/2016/02/02/es6-daily-03-destructuring/#3-%E5%87%BD%E6%95%B0%E5%8F%82%E6%95%B0%E7%9A%84%E5%AE%9A%E4%B9%89\">3. 函数参数的定义</a></li>\n<li><a href=\"/blog/2016/02/02/es6-daily-03-destructuring/#4-%E5%87%BD%E6%95%B0%E5%8F%82%E6%95%B0%E7%9A%84%E9%BB%98%E8%AE%A4%E5%80%BC\">4. 函数参数的默认值</a></li>\n<li><a href=\"/blog/2016/02/02/es6-daily-03-destructuring/#5-%E6%8F%90%E5%8F%96json%E6%95%B0%E6%8D%AE\">5. 提取JSON数据</a></li>\n<li><a href=\"/blog/2016/02/02/es6-daily-03-destructuring/#6-%E9%81%8D%E5%8E%86map\">6. 遍历Map</a></li>\n<li><a href=\"/blog/2016/02/02/es6-daily-03-destructuring/#7-%E8%BE%93%E5%85%A5%E6%A8%A1%E5%9D%97%E7%9A%84%E6%8C%87%E5%AE%9A%E6%96%B9%E6%B3%95\">7. 输入模块的指定方法</a></li>\n</ul>\n</li>\n</ul>","timeToRead":8}},"pageContext":{"slug":"/blog/2016/02/02/es6-daily-03-destructuring"}}}