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 文件就能跑。
现代环境(Chrome 60+、Firefox 54+、Safari 11+、Node.js 8.10+)已原生支持绝大多

import/export 在浏览器中仍需 type="module" 声明,而 Node.js 默认仍用 CommonJS(require())。
const / let:完全可用,替代 var 是最安全的第一步arrow function(=>):可用,但注意 this 绑定规则变化template literals(`${x}`):可用,支持多行和嵌入表达式destructuring(解构赋值):数组和对象解构都可直接用class:语法糖,可用,但本质仍是原型链,不支持真正私有字段(#field 是 ES2025 才有的)Promise:全局可用,但旧版 IE 完全不支持,需查 caniuse
import 写了却报错 “Cannot use import statement outside a module”?这是最常见的落地卡点:语法没错,但执行上下文没被识别为模块。浏览器和 Node.js 对模块的启用方式不同,且默认都不是模块环境。
/* 浏览器中必须这样引入 */
Node.js 中需满足任一条件:
.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)——它们既简洁又不易出错。真正容易被忽略的,是模块系统那层隐式约束:语法对了,环境没配对,照样报错。