#10 JavaScript 2026 技术生态:语言演进、全栈工具链与 AI 编程
JavaScript 2026-10-09Chris Coyier 今年 4 月份发表的技术博客《What To Know in JavaScript (2026 Edition)》介绍了 JavaScript 生态在 2026 年呈现出三个明显趋势:语言原生能力持续增强、前端工具链加速整合,以及 AI 编程逐渐成为日常开发方式。开发者不仅需要关注框架更新,还需要重新评估运行时、构建工具和供应链安全。
coding in a complicated world
Chris Coyier 今年 4 月份发表的技术博客《What To Know in JavaScript (2026 Edition)》介绍了 JavaScript 生态在 2026 年呈现出三个明显趋势:语言原生能力持续增强、前端工具链加速整合,以及 AI 编程逐渐成为日常开发方式。开发者不仅需要关注框架更新,还需要重新评估运行时、构建工具和供应链安全。
新增导入属性,允许在 import 语句中指定附加信息,以指定如何加载模块,主要用于引入非 JavaScript 资源,如 JSON 文件或 CSS 模块。静态导入时,可在路径后加上 with 选项;动态导入时,将其放在第二个参数的 with 字段中,使用起来更加方便简洁,可直接像引用 JS 模块一样使用 JSON 数据等。
提供对 16 位浮点数的原生支持,包括 Float16Array、DataView.prototype.getFloat16 ()/setFloat16 () 以及 Math.f16round (number)。这在 WebGPU / WebGL 中可节省带宽与内存,在深度学习中便于传递模型参数,也可用于模拟硬件精度限制。
ECMAScript(简称 ES)作为 JavaScript 的标准化规范,自 1997 年发布首个版本以来,已经历了多次重要更新。下面为你介绍 ECMAScript 各主要版本及其核心变化:
Object.defineProperty 等特性,提升了代码的规范性和可维护性。Object.values/entries、字符串填充(padStart/padEnd)以及共享内存和原子操作等特性,提升了异步编程的便利性。Promise.finally 以及正则表达式的一些增强功能,如后行断言等,增强了语言的灵活性。Array.flat/flatten、Object.fromEntries、String.trimStart/End、可选的 catch 绑定以及 Symbol.description 等特性,简化了代码编写。Promise.allSettled、globalThis 以及模块动态导入等功能,提升了语言的表达能力。从 ES6 开始,ECMAScript 采用了每年一次的发布周期,版本号以年份命名,这种方式使得新特性能够更快地进入标准,满足开发者的需求。
| ES 版本 | Node.js 最小支持版本 | Chrome 最小支持版本 | Firefox 最小支持版本 |
|---|---|---|---|
| ES6 (ES2015) | v4.0.0 (部分) | 49 | 45 |
| v6.0.0 (接近完整) | |||
| ES2016 (ES7) | v7.0.0 | 51 | 52 |
| ES2017 (ES8) | v8.0.0 | 58 | 52 |
| ES2018 (ES9) | v10.0.0 | 63 | 57 |
| ES2019 (ES10) | v12.0.0 | 73 | 67 |
| ES2020 (ES11) | v14.0.0 | 80 | 74 |
| ES2021 (ES12) | v16.0.0 | 91 | 90 |
| ES2022 (ES13) | v18.0.0 | 96 | 97 |
| ES2023 (ES14) | v20.0.0 | 110 | 111 |
| ES2024 (ES15) | v21.0.0 (部分) | 119 (部分) | 120 (部分) |
在生产环境中使用新特性时,建议搭配 Babel 等转译工具或 TypeScript 以确保兼容性。
看了 How to split JavaScript strings into sentences, words or graphemes with "Intl.Segmenter" 了解到,现在 Web 已经支持分词了:
const text = `我爱北京天安门,天安门上太阳升。伟大领袖毛主席,指引我们向前进。`;
const granularities = ["sentence", "word", "grapheme"];
granularities.forEach(function (granularity) {
// console.log([granularity, index, self])
let segmenter = new Intl.Segmenter("zh", { granularity: granularity });
let seg = segmenter.segment(text);
// console.log(seg) // Segments{}
let result = Array.from(seg, (s) => s.segment);
console.log(result);
});
// ['我爱北京天安门,天安门上太阳升。', '伟大领袖毛主席,指引我们向前进。']
// ['我', '爱', '北京', '天安门', ',', '天安门', '上', '太阳', '升', '。', '伟大', '领袖', '毛主席', ',', '指引', '我们', '向', '前进', '。']
// ['我', '爱', '北', '京', '天', '安', '门', ',', '天', '安', '门', '上', '太', '阳', '升', '。', '伟', '大', '领', '袖', '毛', '主', '席', ',', '指', '引', '我', '们', '向', '前', '进', '。']
在很长一段时间里,浏览器发送 Ajax 请求主要依赖 XMLHttpRequest,也就是大家熟悉的 XHR。
但随着 JavaScript 生态的发展,XHR 的一些问题越来越明显:
于是浏览器推出了更现代、更简洁的网络请求方案 Fetch API。
先看一个传统 Ajax 请求:
var xhr = new XMLHttpRequest();
xhr.open("GET", "/api/user", true);
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
console.log(xhr.responseText);
}
}
};
xhr.send();
虽然功能没问题,但存在几个明显缺点:
JSON.parse(xhr.responseText)
主要是基于 Promise 实现,可以链式调用,不用一层又一层地回调,更符合现代 JavaScript 风格。
注意:这是较新的语法,在某些老版本浏览器上可能支持程度不好,如果需要兼容,可以使用 XHR 或者 Axios、jQuery Ajax 等库。
fetch("/api/user")
.then(function (response) { // Response 对象
return response.json();
})
.then(function (data) {
console.log(data);
})
.catch(function (error) { // 异常处理
console.log(error);
});
相比 XMLHttpRequest:
Fetch 也支持提交数据:
fetch("/api/user", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
name: "Tom",
age: 18
})
})
.then(function (response) {
return response.json();
})
.then(function (data) {
console.log(data);
});
function base64EncodeUnicode(str) {
// First we escape the string using encodeURIComponent to get the UTF-8 encoding of the characters,
// then we convert the percent encodings into raw bytes, and finally feed it to btoa() function.
utf8Bytes = encodeURIComponent(str).replace(
/%([0-9A-F]{2})/g,
function (match, p1) {
return String.fromCharCode("0x" + p1);
},
);
return btoa(utf8Bytes);
}
x.decode('utf-8').encode('raw_unicode_escape').decode('ascii')[2:].strip('0')
"ni wo ta".split(" ");
// [ 'ni', 'wo', 'ta' ]
"ni wo ta".split(" ", 1);
// [ 'ni' ]
"ni wo ta".split(" ", 2);
// [ 'ni', 'wo' ]
"ni wo ta".split(" ", 3);
// [ 'ni', 'wo', 'ta' ]
"ni wo ta".split(" ", 4);
// [ 'ni', 'wo', 'ta' ]
"ni wo ta".split(":");
// [ 'ni wo ta' ]
"ni wo ta".split(":", 1);
// [ 'ni wo ta' ]
"ni wo ta".split(":", 2);
// [ 'ni wo ta' ]
如果要一刀将字符串切两半:
var line = "a : b : c";
var part1 = line.split(":", 1)[0];
if (a !== line) {
var a = part1.trim();
var b = line.substr(part1.length + 1).trim();
console.log([a, b]);
}
var line = "a : b : c";
var index = line.indexOf(":");
if (index != -1) {
var a = line.substr(0, index).trim();
var b = line.substr(index + 1).trim();
console.log([a, b]);
}
jQuery 插件的开发包括两种:
一种是类级别的插件开发,即给 jQuery 添加新的全局函数,相当于给 jQuery 类本身添加方法(jQuery 的全局函数就是属于 jQuery 命名空间的函数)。
另一种是对象级别的插件开发,即给 jQuery 对象添加方法。下面就两种函数的开发做详细的说明。
Ajax 是一种让网页“不用刷新页面,也能和服务器通信”的技术。
比如:
这些功能背后通常都用了 Ajax。
Ajax 全称 Asynchronous JavaScript and XML,意思是 JS 异步请求服务器数据,虽然名字里有 XML,但实际开发里更多使用 JSON。
传统网页的工作流程:
问题:
Ajax 出现后:
function loadUser() {
// 创建 XMLHttpRequest 对象
var xhr = new XMLHttpRequest();
// 配置请求
xhr.open("GET", "/api/user", true);
// 监听状态变化
xhr.onreadystatechange = function () {
// 请求完成
if (xhr.readyState == 4) {
// 请求成功
if (xhr.status == 200) {
// 输出服务器返回的数据
console.log(xhr.responseText);
} else {
console.log("请求失败");
}
}
};
// 发送请求
xhr.send();
}
function submitData() {
var xhr = new XMLHttpRequest();
xhr.open("POST", "/api/user", true);
// 设置请求头
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && xhr.status == 200) {
console.log("提交成功");
}
};
// 提交数据
xhr.send("name=Tom&age=18");
}
IE6/IE7 需要使用:
ActiveXObject;