星号导入(import * as ns)仅收集命名导出,不包含默认导出;生成只读、不可枚举的命名空间对象,属性不可写/配置/删除,且路径须为顶层字符串字面量。

在 JavaScript ES Modules 中,用星号(*)导入整个模块对象,是通过 import * as namespace 语法实现的。它会把模块导出的所有命名导出(named exports)收集到一个命名空间对象中,但**不会包含默认导出(default export)**。
基本语法和用法
假设你有一个模块 mathUtils.js:
// mathUtils.js
export const add = (a, b) => a + b;
export const subtract = (a, b) => a - b;
export const PI = 3.14159;
export default function multiply(a, b) {
return a * b;
}
在另一个文件中,你可以这样星号导入:
// main.js import * as math from './mathUtils.js'; <p>console.log(math.add(2, 3)); // 5 console.log(math.PI); // 3.14159 console.log(math.subtract(10, 4)); // 6 // console.log(math.default(2, 3)); // ❌ 报错:math.default 是 undefined // console.log(math.multiply(2, 3)); // ❌ 报错:multiply 不在命名空间里</p>
星号导入只捕获命名导出
import * as ns 只会把 export const/let/var、export function、export class 等命名导出挂载到 ns 对象上。默认导出会被忽略,除非显式单独导入:
- 用
import multiply from './mathUtils.js'单独获取默认导出 - 或用
import multiply, * as math from './mathUtils.js'同时导入默认 + 命名空间(注意:默认导出会作为multiply绑定,math仍不含它)
命名空间对象是只读且不可枚举的
由 import * as 创建的对象具有以下特性:
- 属性不可写、不可配置、不可枚举(
Object.getOwnPropertyDescriptor(math, 'add')显示writable: false) - 不能新增、删除或重赋值属性(如
math.add = () => {}会静默失败或抛错,取决于严格模式) - 适合做“只读工具集”,避免意外篡改
常见注意事项
- 路径必须是字符串字面量(不能是变量或表达式),否则会报语法错误
- 模块路径需带扩展名(如
.js)或符合运行环境解析规则(Node.js 14+ ESM 要求显式后缀) - 不能在条件语句或函数作用域内使用(
import必须在模块顶层) - 如果模块只有默认导出而无任何命名导出,
import * as ns会得到一个空对象({})
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











