ES6是JavaScript标准的重大升级,现代环境(Chrome 60+等)已原生支持const/let、箭头函数、模板字符串、解构赋值、class和Promise等核心特性;但import/export需模块环境(浏览器加type="module",Node.js需.mjs或"type":"module"),且const/let替代var可避免变量提升与作用域问题。

ES6(ECMAScript 2015)不是“新语言”,而是 JavaScript 语言标准的一次重大升级,浏览器和 Node.js 从 2015 年起逐步支持它。你不需要额外安装或编译就能用——只要运行环境够新,const、let、=> 这些语法直接写进 .js 文件就能跑。
哪些特性可以直接用,不用 Babel?
现代环境(Chrome 60+、Firefox 54+、Safari 11+、Node.js 8.10+)已原生支持绝大多数 ES6 核心特性。但要注意:不是所有 ES6 特性都“开箱即用”,比如 import/export 在浏览器中仍需 type="module" 声明,而 Node.js 默认仍用 CommonJS(require())。
-
const/let:完全可用,替代var是最安全的第一步 -
arrow function(=>):可用,但注意this绑定规则变化 -
template literals(`${x}`):可用,支持多行和嵌入表达式 -
destructuring(解构赋值):数组和对象解构都可直接用 -
class:语法糖,可用,但本质仍是原型链,不支持真正私有字段(#field是 ES2022 才有的) -
Promise:全局可用,但旧版 IE 完全不支持,需查 caniuse
为什么 import 写了却报错 “Cannot use import statement outside a module”?
这是最常见的落地卡点:语法没错,但执行上下文没被识别为模块。浏览器和 Node.js 对模块的启用方式不同,且默认都不是模块环境。
/* 浏览器中必须这样引入 */
Node.js 中需满足任一条件:
立即学习“Java免费学习笔记(深入)”;
- 文件扩展名为
.mjs - 或
package.json中声明"type": "module" - 不能混用
require()和import(同一文件内)
如果只是临时测试,又不想改配置,用 const { foo } = await import('./foo.js'); 动态导入是兼容性更好的 fallback。
const 和 let 真的比 var 更好?
不只是“更好”,而是避免两类经典 bug:var 的变量提升(hoisting)和函数作用域导致的意外覆盖;let/const 是块级作用域 + 暂时性死区(TDZ),行为更可预测。
if (true) {
let x = 1;
const y = 2;
}
console.log(x); // ReferenceError
console.log(y); // ReferenceError
// 而 var x = 1 在 if 外也能访问使用建议:
- 默认用
const,只在变量后续会重新赋值时才用let - 永远不要用
var,即使在 for 循环里——for (let i = 0; ...)才能保证每次迭代的i是独立绑定 -
const不等于“不可变”,它只是不能重新赋值;对象属性、数组元素仍可修改
ES6 特性不是“学完再用”,而是按需渐进启用。最该立刻停用的是 var,最该今天就加到编辑器 snippet 里的是 const { a, b } = obj; 和 arr.map(x => x * 2)——它们既简洁又不易出错。真正容易被忽略的,是模块系统那层隐式约束:语法对了,环境没配对,照样报错。











