详解ES6 export default 和 import语句中的解构赋值


Posted in Javascript onMay 28, 2019

解构赋值

有如下 config 对象

const config = {
 host: 'localhost',
 port: 80
}

要获取其中的 host 属性

let { host } = config

拆分成模块

以上两段代码,放到同一个文件当中不会有什么问题,但在一个项目中,config 对象多处会用到,现在把 config 对象放到 config.js 文件当中。

// config.js
export default {
 host: 'localhost',
 port: 80
}

在 app.js 中 import config.js

// app.js
import config from './config'

let { host } = config
console.log(host) // => localhost
console.log(config.host) // => localhost

上面这段代码也不会有问题。但在 import 语句当中解构赋值呢?

// app.js
import { host } from './config'

console.log(host) // => undefined

问题所在

import { host } from './config'

这句代码,语法上是没什么问题的,之前用 antd-init 创建的项目,在项目中使用下面的代码是没问题的。奇怪的是我在之后用 vue-cli 和 create-react-app 创建的项目中使用下面的代码都不能正确获取到 host。

// config.js
export default {
 host: 'localhost',
 port: 80
}

// app.js
import { host } from './config'
console.log(host) // => undefined

babel 对 export default 的处理

我用 Google 搜 'es6 import 解构失败',找到了下面的这篇文章:ES6的模块导入与变量解构的注意事项。原来经过 webpack 和 babel 的转换

在ES6中变量解构是这样的:

const a = { b: 1 }
const { b } = a

我们可以直接用解构赋值来获得对象的同名属性,等效于:

const b = a.b

除了变量的解构赋值,ES6的模块导入也提供了相似的语法:

import { resolve } from 'path'

如果使用webpack构建项目的话,注意这里的解构与普通变量的解构是有所区别的,比如在a.js里有以下代码:

export default {

 b: 1

}

如果按照普通变量的解构法则来导入这个包,即这种形式:

import { b } from './a'

是会发生错误的,并不能导出变量b。主要因为这和webpack的构建有关。使用模块导入时,当用webpack构建后,以上的

import { b } from './a'

变为了类似

a.default.b

可以看到变量b在a.default上,并不在a上,所以解构出来是undefined。如果要正确解构,则必须在模块内导出,即:

export const b = 1

这样的话,构建后的代码中,变量b即在a上,而不是在a.default上,从而能正确解构。

所以

export default {
 host: 'localhost',
 port: 80
}

变成了

module.exports.default = {
 host: 'localhost',
 port: 80
}

所以取不到 host 的值是正常的。那为什么 antd-init 建立的项目有可以获取到呢?

解决

再次 Google,搜到了GitHub上的讨论 。import 语句中的"解构赋值"并不是解构赋值,而是 named imports,语法上和解构赋值很像,但还是有所差别,比如下面的例子。

import { host as hostName } from './config' // 解构赋值中不能用 as

let obj = {
 a: {
 b: 'hello',
 }
}

let {a: {b}} = obj // import 语句中不能这样子写
console.log(b) // => helllo

这种写法本来是不正确的,但 babel 6之前可以允许这样子的写法,babel 6之后就不能了。

// a.js
import { foo, bar } from "./b"
// b.js
export default {
 foo: "foo",
 bar: "bar"
}

所以还是在import 语句中多加一行

import b from './b'
let { foo, bar } = b

或者

// a.js
import { foo, bar } from "./b"
// b.js
let foo = "foo"
let bar = "bar"
export { foo, bar }

或者

// a.js
import { foo, bar } from "./b"
// b.js
export let foo = "foo"
export let bar = "bar"

而 antd-init 使用了babel-plugin-add-module-exports,所以 export default 也没问题。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
一个很简单的办法实现TD的加亮效果.
Jun 29 Javascript
基于jQuery的计算文本框字数的代码
Jun 06 Javascript
javascript实现简单的分页特效
Aug 12 Javascript
微信小程序 ES6Promise.all批量上传文件实现代码
Apr 14 Javascript
JS实现浏览上传文件的代码
Aug 23 Javascript
jQuery+CSS实现的table表格行列转置功能示例
Jan 08 jQuery
js中getBoundingClientRect的作用及兼容方案详解
Feb 01 Javascript
react组件从搭建脚手架到在npm发布的步骤实现
Jan 09 Javascript
Layui Form 自定义验证的实例代码
Sep 14 Javascript
JQuery中的常用事件、对象属性与使用方法分析
Dec 23 jQuery
js实现点击选项置顶动画效果
Aug 25 Javascript
vue实现几秒后跳转新页面代码
Sep 09 Javascript
jQuery实现高级检索功能
May 28 #jQuery
利用原生JS实现data方法示例代码
May 28 #Javascript
php结合js实现多条件组合查询
May 28 #Javascript
vue实现前台列表数据过滤搜索、分页效果
May 28 #Javascript
js 将线性数据转为树形的示例代码
May 28 #Javascript
React中使用外部样式的3种方式(小结)
May 28 #Javascript
vue实现多条件和模糊搜索功能
May 28 #Javascript
You might like
PHP+Ajax异步通讯实现用户名邮箱验证是否已注册( 2种方法实现)
2011/12/28 PHP
PHP面向对象学习笔记之一 基础概念
2012/10/06 PHP
深入解析php中的foreach问题
2013/06/30 PHP
php的数组与字符串的转换函数整理汇总
2013/07/18 PHP
php实现购物车功能(下)
2016/01/05 PHP
PHP实现可自定义样式的分页类
2016/03/29 PHP
在textarea中显示html页面的javascript代码
2007/04/20 Javascript
js获取日期:昨天今天和明天、后天
2014/06/11 Javascript
js removeChild 方法深入理解
2016/08/16 Javascript
聊一聊jQuery插件uploadify使用方法
2016/08/24 Javascript
JavaScript每天必学之数组和对象部分
2016/09/17 Javascript
jQuery的ajax中使用FormData实现页面无刷新上传功能
2017/01/16 Javascript
Nuxt.js踩坑总结分享
2018/01/18 Javascript
javascript自定义日期比较函数用法示例
2019/07/22 Javascript
关于JavaScript数组去重的一些理解汇总
2020/09/10 Javascript
浅析微信小程序自定义日历组件及flex布局最后一行对齐问题
2020/10/29 Javascript
vue解决跨域问题(推荐)
2020/11/10 Javascript
python爬取w3shcool的JQuery课程并且保存到本地
2017/04/06 Python
Python实现的简单dns查询功能示例
2017/05/24 Python
解析Python中的eval()、exec()及其相关函数
2017/12/20 Python
Python爬虫框架scrapy实现的文件下载功能示例
2018/08/04 Python
python实现的接收邮件功能示例【基于网易POP3服务器】
2019/09/11 Python
在keras下实现多个模型的融合方式
2020/05/23 Python
Python 保存加载mat格式文件的示例代码
2020/08/04 Python
python利用xlsxwriter模块 操作 Excel
2020/10/14 Python
CSS3中伪元素::before和::after的用法示例
2017/09/18 HTML / CSS
新加坡最佳婴儿用品店:Mamahood.com.sg
2018/08/26 全球购物
c/c++某大公司的两道笔试题
2014/02/02 面试题
关于递归的一道.NET面试题
2013/05/12 面试题
建筑施工员岗位职责
2013/11/26 职场文书
计算机专业毕业生自荐书
2014/06/02 职场文书
党的群众路线对照检查材料
2014/08/27 职场文书
超市员工辞职信范文
2015/05/12 职场文书
2019个人工作自我评价范文(3篇)
2019/09/19 职场文书
如何利用python和DOS获取wifi密码
2021/03/31 Python
pytorch 实现在测试的时候启用dropout
2021/05/27 Python