ECMAScript基本引用类型
Date、RegExp、原始值包装对象与单例内置对象等非集合引用类型概览。
#type / concept
#status / growing
#resource / javascript
#resource / ecmascript
[!info] related notes
ECMAScript基本引用类型
这篇笔记把 ECMAScript 里那些不是集合容器、但又经常出现的内置引用类型放在一起看。
主要包括什么
DateRegExp- 原始值包装对象:
Boolean、Number、String - 单例内置对象:
Math以及全局对象相关能力
原始值包装对象要特别注意
语言会在需要时把原始值临时装箱,所以你可以对字符串调用方法,但这不代表原始值真的变成了长期存在的对象。
重点边界:
- 原始值和包装对象不是一回事
new Boolean(false)仍然是对象,因此在布尔上下文里是真值
String 包装对象
常用方法速查
字符串方法详见:javascript-string-methods
核心方法(优先掌握):
| 类别 | 方法 | 作用 |
|---|---|---|
| 长度 | .length | 属性,返回编码单元数 |
| 取字符 | .at(i) / .charAt(i) / [i] | 取单个字符 |
| 查找 | .includes(str) | 是否包含 |
| 查找 | .indexOf(str) | 查找位置 |
| 截取 | .slice(start, end?) | 截取子串 |
| 替换 | .replace() / .replaceAll() | 替换内容 |
| 大小写 | .toUpperCase() / .toLowerCase() | 转换大小写 |
| 去空格 | .trim() / .trimStart() / .trimEnd() | 去除空白 |
| 拆分 | .split(sep) | 字符串转数组 |
| 拼接 | .concat() 或 + / 模板字符串 | 拼接字符串 |
静态方法
String.fromCharCode(...codes)- 从 UTF-16 码元创建字符串String.fromCodePoint(...codePoints)- 从 Unicode 码点创建字符串String.raw- 模板字符串的原始字符串
关键特性
- 不可变性:所有方法返回新字符串,不修改原字符串
- UTF-16 编码:
.length统计编码单元,emoji 可能长度为 2
Number 包装对象
常用方法
| 方法 | 作用 | 示例 |
|---|---|---|
.toFixed(n) | 保留 n 位小数,返回字符串 | (123.456).toFixed(2) → "123.46" |
.toPrecision(n) | 保留 n 位有效数字 | (123.456).toPrecision(4) → "123.5" |
.toString(radix) | 转为字符串,可指定进制 | (255).toString(16) → "ff" |
.valueOf() | 返回原始数值 | |
.toLocaleString() | 本地化数字格式 |
静态属性
| 属性 | 值 | 说明 |
|---|---|---|
Number.MAX_VALUE | ≈1.8e308 | 最大正数 |
Number.MIN_VALUE | ≈5e-324 | 最小正数 |
Number.MAX_SAFE_INTEGER | 2^53-1 | 最大安全整数 |
Number.MIN_SAFE_INTEGER | -(2^53-1) | 最小安全整数 |
Number.POSITIVE_INFINITY | Infinity | |
Number.NEGATIVE_INFINITY | -Infinity | |
Number.NaN | NaN |
静态方法
| 方法 | 作用 | 与全局函数区别 |
|---|---|---|
Number.isNaN(v) | 判断是否 NaN | 不会尝试类型转换 |
Number.isFinite(v) | 判断是否有限数 | 不会尝试类型转换 |
Number.isInteger(v) | 判断是否整数 | |
Number.isSafeInteger(v) | 判断是否安全整数 | |
Number.parseInt(str, radix) | 解析整数 | 等同全局 parseInt |
Number.parseFloat(str) | 解析浮点数 | 等同全局 parseFloat |
关键区别:Number.isNaN vs 全局 isNaN
isNaN("hello"); // true (先转换为数字)
Number.isNaN("hello"); // false (不转换,"hello" 不是 NaN)
isNaN(NaN); // true
Number.isNaN(NaN); // true
Boolean 包装对象
Boolean 包装对象比较简单,几乎不需要使用。
常用方法
.valueOf()- 返回原始布尔值.toString()- 返回"true"或"false"
重要陷阱
const falseObj = new Boolean(false);
if (falseObj) {
// 会执行!因为 falseObj 是对象,对象是真值
}
结论:永远不要用 new Boolean(),直接用原始值 true / false。
Date
Date 主要解决时间点表示、时间戳转换和格式化协作问题,但现代项目里很多复杂日期处理会进一步交给专门库。
常用方法
| 方法 | 作用 |
|---|---|
new Date() | 当前时间 |
new Date(timestamp) | 从时间戳创建 |
new Date(y, m, d, h, min, s, ms) | 从分量创建(月份从 0 开始) |
.getTime() | 获取时间戳(毫秒) |
.getFullYear() | 获取年份 |
.getMonth() | 获取月份(0-11) |
.getDate() | 获取日期(1-31) |
.getDay() | 获取星期(0-6) |
.getHours() / .getMinutes() / .getSeconds() | 获取时分秒 |
.toISOString() | ISO 8601 格式字符串 |
.toLocaleDateString() | 本地化日期字符串 |
.toLocaleTimeString() | 本地化时间字符串 |
Date.now() | 静态方法,获取当前时间戳 |
关键特性
- 月份从 0 开始:0 = 一月,11 = 十二月
- 可变对象:
setXxx方法会修改原对象 - 时区敏感:
getXxx返回本地时间,getUTCXxx返回 UTC 时间
RegExp
正则表达式也是内置引用类型之一,但它的语法和状态行为值得单独展开。
延伸阅读:ecmascript-regular-expressions
Math 与全局对象
Math 是单例对象,提供数学常量和计算方法。
常用属性
| 属性 | 值 |
|---|---|
Math.PI | ≈3.14159 |
Math.E | ≈2.71828 |
Math.LN2 | ≈0.693 |
Math.LN10 | ≈2.302 |
常用方法
| 方法 | 作用 |
|---|---|
Math.abs(x) | 绝对值 |
Math.round(x) | 四舍五入 |
Math.floor(x) | 向下取整 |
Math.ceil(x) | 向上取整 |
Math.trunc(x) | 截断小数部分 |
Math.sign(x) | 返回 -1/0/1 |
Math.max(...args) | 最大值 |
Math.min(...args) | 最小值 |
Math.pow(x, y) | x 的 y 次方 |
Math.sqrt(x) | 平方根 |
Math.random() | 0-1 随机数 |
Math.log(x) | 自然对数 |
Math.log2(x) | 以 2 为底的对数 |
Math.log10(x) | 以 10 为底的对数 |
生成指定范围随机整数
// [min, max] 范围的随机整数
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
关键区别:Math.floor vs Math.trunc vs Math.round
Math.floor(-1.5); // -2 (向下取整)
Math.trunc(-1.5); // -1 (截断小数)
Math.round(-1.5); // -2 (四舍五入)
Math.ceil(-1.5); // -1 (向上取整)
全局对象相关能力
全局函数
| 函数 | 作用 | 备注 |
|---|---|---|
isNaN(v) | 判断是否 NaN | 会先类型转换 |
isFinite(v) | 判断是否有限数 | 会先类型转换 |
parseInt(str, radix) | 解析整数 | |
parseFloat(str) | 解析浮点数 | |
encodeURI(uri) | 编码 URI | 不编码 URI 字符 |
decodeURI(uri) | 解码 URI | |
encodeURIComponent(str) | 编码 URI 组件 | 编码更多字符 |
decodeURIComponent(str) | 解码 URI 组件 |
全局常量
| 常量 | 值 |
|---|---|
Infinity | 正无穷 |
-Infinity | 负无穷 |
NaN | 非数字 |
undefined | 未定义 |
null | 空值 |
和集合引用类型怎么区分
如果主题重点在保存一组值、键值对或可迭代容器,更适合放到 ecmascript-collection-reference-types 去看。