关于ES6 module的疑问

今天重新看了阮一峰的《ES6 标准入门》,这个地方产生了一点疑问,书上说是接口和模块变量一一对应,我还有点迷惑,求大佬指点。

问题1:

// 1.js
const a = 1 
const b = 2
export default { a, b }

// 2.js
import c from "./1.js"  
const { a, b } = c  // 可以成功解构,但是下面是简化后的操作

import { a, b } from "./1.js" // 1. 为什么会报错?

问题2:

const a = 1
const b = 2
const c = { a, b }

export c // 2.和下面表现得是一个东西,为什么会报错?
export { a, b }  

问题3:

// 3. 为什么下面的这样导出可以呢?
// 4. const a = 1这个声明也可以是接口吗?
// 5. 他怎么去对应a这个变量?
export const a = 1
阅读 2.2k
2 个回答

1、import 从语法上不支持解构赋值,否则会和下面的语法产生歧义:

// 1.js 导出多个模块
export const a = 1;
export const b = 2;

// 2.js 一次性导入多个模块
import { a, b } from './1.js';

这种语法叫 named imports,语法上和解构赋值很像,但不一样。


2、还是语法问题。凡事不要想当然,多看文档。


3、ES 中哪来的“接口”?你想问 TypeScript?我没看过这本《ES6 标准入门》,你可以贴一下相关原文。


P.S. 有关 import / export 的语法规范,可以参考 ECMA 官方文档(①);相关的具体示例可以参阅 MDN(②③)。

https://www.ecma-internationa...
https://developer.mozilla.org...
https://developer.mozilla.org...

import 里的 {} 不是解构。

ES6 export 有“两种”。

一种没有 default。是 export var/let/const a; export function a(){}; export class a{};。这种需要用 import {a} form ... 来导入,必须放在 {} 里面。

还有一种有 default。是 export default a; export default function a(){}; export default class a{};。这种需要用 import a from ... 来导入,不能有 {}

default 于非 default的导出同时存在时,可以使用 import a, {b, c} from ... 的方式一起导入。

所以:
问题1:{} 不是结果,换一种写法对应不同的 export 项。所以不行。

问题2:export c; 也是不可以的。但是 export const c={a,b}; 是可以的。非 default export 必须是一个(变量/函数/类)的声明。c{a,b} 都不是,所以不成。

但是,export default c; export default {a,b}; 都是可以的。(他们不能出现在同一个 module 里,一个 module 只能由一个 export default 。)export default 可以直接放一个表达式。

非 default 导出必须有一个名字,不然导入的时候无法对应。只有声明才能确定一个名字。但 default 导出不需要名字,导入的时候也不需要使用名字对应,所以可以直接放表达式。

问题3:见上,用 import {a} from ... 导入。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题