JavaScript 内置对象实战:Math、字符串、随机数与字符统计
本文目录
内置对象是语言和宿主提供的标准能力。Math.max 是静态方法,直接通过 Math 调用;字符串的 replace 是实例方法,需要在一个字符串值上调用。Math、Date、String 和 Array 提供不同能力,浏览器的 window、document 则属于宿主 API。不要把“内置对象”“BOM 对象”和所有全局变量混为一类。
Math 与随机数范围
Math.floor 向下取整,Math.ceil 向上取整,Math.round 按规则取整;负数边界要单独验证。Math.max 接收一组数并返回最大值,空参数返回 -Infinity。现代代码可用展开运算,但在不可信或极大数组上要避免一次展开成超多函数参数。
function randomInt(min, maxExclusive) {
if (!Number.isInteger(min) || !Number.isInteger(maxExclusive) || maxExclusive <= min) {
throw new RangeError('范围必须是递增的整数区间');
}
return Math.floor(Math.random() * (maxExclusive - min)) + min;
}
randomInt(0, 6); // 0 到 5
这个函数的上界不包含在范围内。Math.random 适用于普通抽签和界面演示,不适合密码、验证码或安全令牌。安全场景应使用 Web Crypto,并按目标区间做无偏采样;直接对随机字节取模会产生偏差。随机颜色可以通过 CSS HSL 生成,也可用六位十六进制值,但要明确格式并避免把伪随机当作安全来源。
String 不可变与替换
字符串是不可变值,replace 返回新字符串,不会修改原字符串。replace 默认只替换首个匹配;需要全部替换可以使用 replaceAll,或在正则表达式中加 g。正则中的用户输入要先转义,避免改变表达式语义或构造高复杂度模式。
const text = 'www.example.test';
const first = text.replace('w', 'd');
const all = text.replaceAll('w', 'd');
const words = 'one, two; three'.split(/[,;]\s*/);
历史笔记中的截取小数位、从 Math.random 字符串中拼颜色等技巧依赖实现细节,不适合作为通用方案。格式化小数用 Intl.NumberFormat;随机范围用明确的整数算法;日期显示则指定语言和时区,避免用户所在地不同导致结果误解。
统计字符不能只看 length
字符串 length 与索引按 UTF-16 code unit 计算;展开字符串会按 Unicode code point 遍历,仍可能把由多个 code point 组成的旗帜、组合音标或肤色 emoji 拆开。面向用户的“字符数”通常要按 grapheme cluster 计算,可使用 Intl.Segmenter;若目标浏览器不支持,应明确降级策略。
function countGraphemes(text) {
if (typeof Intl.Segmenter !== 'function') return Array.from(text).length;
const segmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' });
return Array.from(segmenter.segment(text)).length;
}
countGraphemes('A👩💻'); // 2(支持 Intl.Segmenter 的环境)
统计频次优先用 Map,避免普通对象原型键造成歧义。先决定统计的是 UTF-16 单元、码点、字素簇还是词,再决定是否做大小写折叠、规范化和语言分词;这些是产品规则,不是一个循环就能替用户决定的。
检查清单
- 随机范围是左闭右开还是两端都包含?
- 结果是否用于安全用途;若是,是否改用 Web Crypto?
- 替换是首次还是全部,用户输入是否会进入正则?
- 字符统计面向程序编码单位还是用户感知字符?
- Date/Number 格式是否显式指定 locale、时区和精度?
参考:MDN Math、MDN Math.random、MDN Web Crypto、MDN String.replace、MDN Intl.Segmenter、Unicode Text Segmentation。
Live Notes
留言提交后会先进入审核,审核通过后对其他读者公开。