JavaScript高级程序设计笔记 5
第5章 基本引用类型
1. Date
1.1 创建 Date 对象
let now = new Date();// 当前日期时间let date = new Date(年, 月, 日, 时, 分, 秒, 毫秒);// 月从0开始let date = new Date("2024-01-01T12:00:00");// ISO 8601 字符串let date = new Date(毫秒数);// 1970-01-01 00:00:00 UTC 的毫秒数
1.2 静态方法
| 方法 | 说明 |
|---|---|
Date.now() |
返回当前时间毫秒数(性能测量常用) |
Date.parse() |
解析日期字符串,返回毫秒数 |
Date.UTC() |
返回指定 UTC 时间的毫秒数(参数为年、月、日...) |
1.3 实例方法
获取/设置本地时间:
getFullYear()/setFullYear()// 年getMonth()/setMonth()// 月(0-11)getDate()/setDate()// 日(1-31)getDay()// 星期几(0-6,0=周日)getHours()/setHours()// 时getMinutes()/setMinutes()// 分getSeconds()/setSeconds()// 秒getMilliseconds()/setMilliseconds()// 毫秒
获取/设置 UTC 时间:上述方法名中 get 改为 getUTC,set 改为 setUTC。
格式化方法:
toDateString()// 周几 月 日 年toTimeString()// 时:分:秒 时区toLocaleString()// 本地格式toISOString()// ISO 8601 格式
1.4 常见操作
// 计算代码执行时间
let start = Date.now();
// ... 代码 ...
let end = Date.now();
console.log(`耗时 ${end - start} ms`);
// 比较日期
let date1 = new Date(2024, 0, 1);
let date2 = new Date(2024, 0, 2);
console.log(date1 < date2); // true
2. RegExp
2.1 创建正则表达式
- 字面量:
let pattern = /pattern/flags; - 构造函数:
let pattern = new RegExp("pattern", "flags");
2.2 标志(flags)
| 标志 | 说明 |
|---|---|
g |
全局匹配,找到所有匹配项 |
i |
忽略大小写 |
m |
多行模式 |
y |
粘附模式,从 lastIndex 开始匹配 |
u |
Unicode 模式 |
s |
dotAll 模式,. 匹配换行符 |
2.3 实例方法
exec(str):返回匹配结果数组(第一项为匹配文本,后续为捕获组),同时更新lastIndex属性。let pattern = /(ab)c/g; let str = "abc abc"; let match = pattern.exec(str); console.log(match[0]); // "abc" console.log(match[1]); // "ab" console.log(match.index); // 0 console.log(pattern.lastIndex); // 3test(str):返回布尔值,是否匹配。toString()/toLocaleString():返回正则表达式的字面量字符串。
2.4 构造函数属性(静态属性)
| 属性 | 说明 | 简写 |
|---|---|---|
input |
最后匹配的字符串 | $_ |
lastMatch |
最后匹配的文本 | $& |
lastParen |
最后捕获组 | $+ |
leftContext |
匹配文本前的文本 | $` |
rightContext |
匹配文本后的文本 | $' |
2.5 常用正则示例
// 手机号(简单版)
let phone = /^1[3-9]\d{9}$/;
// 邮箱
let email = /^[\w.-]+@[\w.-]+\.\w+$/;
// 提取所有数字
let nums = "a1b2c3".match(/\d/g); // ["1","2","3"]
3. 原始值包装类型
概念:当以读模式访问原始值(Boolean、Number、String)时,JS 会在后台临时创建一个对应的包装类型对象,使得原始值可以像对象一样调用方法,调用完后立即销毁。
3.1 Boolean
let boolObj = new Boolean(false);// 不推荐,typeof 返回 "object"- 注意:
new Boolean(false)是对象,if(boolObj)为 true - 建议:直接使用原始布尔值。
3.2 Number
静态属性:
Number.MAX_VALUE/MIN_VALUENumber.NaN/NEGATIVE_INFINITY/POSITIVE_INFINITYNumber.EPSILON// 极小常量,用于浮点数比较
实例方法:
toFixed(n):四舍五入保留 n 位小数(返回字符串)toExponential(n):科学记数法toPrecision(n):根据 n 决定使用toFixed或toExponentialtoString(radix):指定进制(2-36)
数值转换:Number()、parseInt()、parseFloat()
3.3 String
属性:length(字符数,注意 Unicode 代理对)
字符方法:
charAt(index):返回指定位置字符charCodeAt(index):返回字符 Unicode 编码codePointAt(index):ES6,返回完整码点(支持代理对)
操作方法:
concat(str1, str2, ...):拼接,但常用+slice(start, end)、substring(start, end)、substr(start, len)- 区别:
slice支持负索引,substring将负转为 0,substr第二个参数为长度(已废弃)
- 区别:
位置方法:
indexOf(search, fromIndex):从左查找lastIndexOf(search, fromIndex):从右查找includes(search, start)、startsWith()、endsWith()(ES6)
正则相关方法:
match(pattern):返回匹配数组search(pattern):返回匹配索引,未匹配返回 -1replace(pattern, replacement):替换split(separator, limit):分割为数组
其他常用:
trim()/trimStart()/trimEnd():去除空白toLowerCase()/toUpperCase():大小写转换repeat(count):重复字符串(ES6)padStart(len, pad)/padEnd(len, pad):填充(ES6)
4. 单例内置对象
4.1 Global
定义:全局作用域中的终极对象,所有全局属性和方法都是 Global 的成员。浏览器中 window 充当 Global。
核心方法:
isNaN()、isFinite()、parseInt()、parseFloat()encodeURI()/decodeURI():对整个 URI 编码,保留特殊字符(如 : / ? #)encodeURIComponent()/decodeURIComponent():对 URI 组件编码,编码更多字符(常用)eval():解析并执行字符串中的 JS 代码(危险,不推荐)
全局属性:undefined、NaN、Infinity、Object、Array、Function 等所有内置构造函数。
4.2 Math
属性:Math.PI、Math.E、Math.LN10 等
方法:
- 舍入:
Math.ceil()(上取整)、Math.floor()(下取整)、Math.round()(四舍五入) - 随机:
Math.random()返回 [0,1) 的随机数 - 最大/最小:
Math.max()、Math.min() - 幂/开方:
Math.pow()、Math.sqrt()、Math.cbrt()(立方根) - 三角:
Math.sin()、Math.cos()、Math.tan()等
常用公式:
// [min, max] 之间的随机整数
function randomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
5. 常见面试题速查
Date
-
如何获取当前时间戳?
→Date.now()或new Date().getTime()。 -
如何创建一个指定日期的 Date 对象?
→new Date(2024, 0, 1)(月从 0 开始)或new Date("2024-01-01")。 -
如何比较两个日期的大小?
→ 直接使用<>,因为 Date 对象会转为毫秒数。
RegExp
-
正则表达式的
exec和test方法有什么区别?
→exec返回匹配结果数组,test返回布尔值。 -
g标志如何影响exec的结果?
→ 每次调用exec会从lastIndex开始查找,可迭代遍历所有匹配项。 -
如何匹配一个字符串中的所有数字?
→str.match(/\d/g)。
原始值包装类型
-
为什么原始值可以调用
.toFixed()等方法?
→ 访问时临时创建包装类型对象,调用完立即销毁。 -
new Boolean(false)和false有什么区别?
→ 前者是对象,if(obj)为 true;后者是原始布尔值。 -
parseInt和parseFloat的区别?
→parseInt解析整数,可指定进制;parseFloat解析浮点数,只解析十进制。 -
如何判断一个浮点数是否在误差范围内相等?
→ 比较差值是否小于Number.EPSILON。
String
-
slice、substring、substr有什么区别?
→slice支持负索引;substring负转 0;substr第二个参数是长度(已废弃)。 -
如何判断字符串是否包含某个子串?
→includes()、indexOf() !== -1、正则test()。 -
如何将字符串的首字母大写?
→str.charAt(0).toUpperCase() + str.slice(1)。
Global 与 Math
-
encodeURIComponent与encodeURI有什么区别?
→encodeURIComponent编码更多字符(包括/?:@&),适合编码 URL 参数;encodeURI保留 URI 特殊字符,适合编码完整 URI。 -
eval为什么是不安全的?
→ 会执行字符串中的任意代码,导致 XSS 风险,且难以优化。 -
如何生成 [min, max] 之间的随机整数?
→Math.floor(Math.random() * (max - min + 1)) + min。

浙公网安备 33010602011771号