Date对象及其方法
1. 创建Date对象
常见的创建方式有以下几种:
// 1. 无参数:表示当前时间(本地时区)
const now = new Date();
// 2. 传入时间戳(毫秒级,number类型,从1970-01-01 00:00:00 UTC(国际标准时间)开始计算)
const date1 = new Date(1620000000000); // 对应2021-05-03左右
// 3. 传入日期字符串(支持ISO格式、自然语言格式等)
const date2 = new Date("2024-09-28"); // 2024年9月28日
const date3 = new Date("2024-09-28 12:30:45"); // 带时分秒
// 4. 传入年、月、日、时、分、秒、毫秒(注意:月份从0开始,0=1月,以此类推,11=12月)
const date4 = new Date(2024, 8, 28, 12, 30, 45); // 2024年9月28日12:30:45
2. 常用方法
Date对象的方法分为获取 / 设置本地时间和获取 / 设置 UTC 时间(国际标准时间)两类,常用方法如下:
| 方法 |
说明(本地时间) |
对应 UTC 方法(国际标准时间) |
getFullYear() |
获取年份(4 位,如 2024) |
getUTCFullYear() |
getMonth() |
获取月份(0-11,0=1 月) |
getUTCMonth() |
getDate() |
获取日期(1-31) |
getUTCDate() |
getDay() |
获取星期 (0-6,0=周日) |
getUTCDay() |
getHours() |
获取小时(0-23) |
getUTCHours() |
getMinutes() |
获取分钟(0-59) |
getUTCMinutes() |
getSeconds() |
获取秒数(0-59) |
getUTCSeconds() |
getMilliseconds() |
获取毫秒(0-999) |
getUTCMilliseconds() |
getTime() |
获取时间戳(毫秒级,从 1970-01-01 UTC 开始) |
- |
setFullYear(year) |
设置年份(如 setFullYear (2025)) |
setUTCFullYear(year) |
setMonth(month) |
设置月份(0-11) |
setUTCMonth(month) |
Date.now() |
直接获取此时此刻的时间戳 |
- |
3. 利用时间戳获取当前的年月日时分秒
// 1. 获取当前时间戳
const timestamp = Date.now();
// 2. 用时间戳创建Date对象
const date = new Date(timestamp);
// 3. 提取年月日时分秒
const year = date.getFullYear();
const month = date.getMonth() + 1; // 月份0-11,需+1
const day = date.getDate();
const hours = date.getHours();
const minutes = date.getMinutes();
const seconds = date.getSeconds();
// 4. 格式化输出(补零处理)
const formatted = `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')} ${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;
console.log("当前时间(Date):" + formatted);
// 示例输出:2025-09-28 15:30:45
定时器与延时器
1. 延时器:setTimeout(延迟执行一次)
setTimeout用于在指定毫秒数后执行一次函数,返回一个定时器 ID(number类型),可用于后续取消任务。
let timerId: number = setTimeout(handler: Function, delay: number, ...args: any[]): number;
handler:延迟后执行的函数,写成箭头函数的样式。
delay:延迟时间(毫秒,默认 0)。
args:传递给 handler 的参数(可选)。
// 3秒后执行一次任务
const delayId = setTimeout((name: string) => {
console.log(`Hello, ${name}! 3秒已过`);
}, 3000, "ArkTS"); // 最后一个参数"ArkTS"会传给handler
// 取消延时任务(如果在3秒内执行)
// clearTimeout(delayId);
2. 定时器:setInterval(周期性执行)
setInterval用于每隔指定毫秒数重复执行函数,返回一个定时器 ID,可用于取消任务。
let timerId: number = setInterval(handler: Function, interval: number, ...args: any[]): number;
handler:每次间隔后执行的函数。
interval:间隔时间(毫秒)。
args:传递给 handler 的参数(可选)。
// 每隔1秒执行一次任务(打印当前时间)
let count = 0;
const intervalId = setInterval(() => {
count++;
console.log(`第${count}次执行:${new Date().toLocaleTimeString()}`);
// 执行5次后停止
if (count >= 5) {
clearInterval(intervalId);
console.log("定时器已停止");
}
}, 1000);
3. 取消任务:clearTimeout与clearInterval
clearTimeout(timerId):取消setTimeout创建的延时任务。
clearInterval(timerId):取消setInterval创建的周期性任务。
注意:必须保存定时器 ID 才能取消任务,否则任务会一直执行(可能导致内存泄漏)。
正则表达式
基本概念
- 数据类型:Regular Expression(正则表达式),属于复杂数据类型
- 作用:按特定语法规则创建模式,用于验证字符串是否符合规则
正则表达式的创建方式
- 字面量方式javascript运行
let 变量名 = /正则符号/;
- 内置构造函数方式javascript运行
let 变量名 = new RegExp('正则符号');
常用方法
- test () - 匹配方法
- 语法:
正则.test(要检测的字符串)
- 返回值:布尔值(
true表示符合规则,false表示不符合)
- exec () - 捕获方法(暂未讲解)
符号组成
1. 普通元字符
| 符号 |
含义 |
说明 |
\d |
一位数字 |
匹配 0-9 任意数字 |
\D |
一位非数字 |
匹配非数字字符 |
\s |
一位空白内容 |
匹配空格、缩进等空白字符 |
\S |
一位非空白内容 |
匹配非空白字符 |
\w |
一位数字 / 字母 / 下划线 |
匹配 0-9、a-z、A-Z、_ |
\W |
一位非数字 / 字母 / 下划线 |
匹配非\w字符 |
. |
一位非换行任意内容 |
匹配除换行外任意字符 |
\ |
转义符 |
将有意义符号转为文本,或反之 |
2. 边界元字符
| 符号 |
含义 |
说明 |
^ |
开头 |
表示字符串开始位置 |
$ |
结尾 |
表示字符串结束位置 |
- 注意:
^和$一起使用时,表示完整匹配(从开头到结尾)
3. 限定元字符
| 符号 |
含义 |
说明 |
* |
0 到多次 |
匹配前面元素 0 次或多次 |
+ |
1 到多次 |
匹配前面元素 1 次或多次 |
? |
0 到 1 次 |
匹配前面元素 0 次或 1 次 |
{n} |
恰好 n 次 |
匹配前面元素恰好 n 次 |
{n,} |
n 到多次 |
匹配前面元素至少 n 次 |
{n,m} |
n 到 m 次 |
匹配前面元素 n 到 m 次 |
4. 特殊元字符
| 符号 |
含义 |
说明 |
|
() |
分组 |
1. 单独捕获;2. 作为一个整体 |
|
| ` |
` |
或 |
分界线为小括号或正则边界 |
[] |
包含 |
匹配括号内任意一个字符 |
|
[^] |
非 |
匹配不在括号内的任意字符 |
|
- |
至 |
与[]或[^]连用,表示范围 |
|
- 范围示例:
[0-9]等价于\d;[^0-9]等价于\D;[\u4e00-\u9fa5]表示所有中文字符
5. 重复元字符
| 符号 |
含义 |
说明 |
\数字 |
重复引用 |
重复第 n 个分组的内容(需完全一致) |
标识符
| 符号 |
含义 |
说明 |
i |
忽略大小写 |
匹配时不区分大小写 |
g |
全局匹配 |
匹配所有符合条件的结果 |
应用示例
- HTML 标签匹配javascript运行
let reg = /^<(p|span)><\/\1>$/i; console.log(reg.test('<P></p>')); // true console.log(reg.test('<p></span>')); // false
- 复杂模式匹配javascript运行
let reg = /^[1234](a|b|c|d)##(111|222|333)\2@@\1{2}$/; console.log(reg.test('1a##111111@@aa')); // true
注意事项
- 正则中的特殊字符需用
\转义
- 用
()分组时,可通过\数字引用分组内容
|操作符优先级较低,通常需与()配合使用
- 字符范围
[a-z]基于 Unicode 编码,需连续才能使用
正则表达式的捕获
exec() 方法
- 语法:
正则.exec(字符串)
- 作用:从原始字符串中捕获符合正则要求的字符串片段
- 返回值:
- 没有匹配项时返回
null
- 有匹配项时返回一个数组,
[0] 位置是捕获出的字符串片段
不同情况下的捕获行为
1. 没有 () 和 g
let reg = /\d{3}/;
let str = 'qwerty123uiopas456dfghjkzxcv789bnm000';
let res = reg.exec(str); // ["123"]
2. 有 () 分组
let reg = /(\d{2})(\d{2})(\d{2})/;
let str = '1234567890';
let res = reg.exec(str);
// ["123456", "12", "34", "56"]
3. 有 g 全局标识符
let reg = /\d{3}/g;
let str = 'qwerty123uiopas456dfghjkzxcv789bnm000';
let res1 = reg.exec(str); // ["123"]
let res2 = reg.exec(str); // ["456"]
let res3 = reg.exec(str); // ["789"]
let res4 = reg.exec(str); // ["000"]
let res5 = reg.exec(str); // null
匹配但不捕获 (?:)
let reg = /(\d{2})(\d{2})(?:\d{4})(\d{2})(\d{2})/;
let str = '123456789012';
let res = reg.exec(str);
// ["123456789012", "12", "34", "90", "12"]
捕获所有匹配项的示例
let reg = /\d{3}/g;
let str = 'qwerty123uiopas456dfghjkzxcv789bnm000';
let arr: string[] = [];
let res = reg.exec(str);
while (res !== null) {
arr.push(res[0]);
res = reg.exec(str);
}
console.log(arr); // ["123", "456", "789", "000"]
正则表达式的两大特性
1. 懒惰性
- 表现:每次捕获都从字符串
[0] 位置开始检索
- 解决方法:添加全局标识符
g
2. 贪婪性
- 表现:捕获时会尽可能多地获取内容
- 解决方法:使用非贪婪限定符(在原有限定符后加
?)
| 贪婪限定符 |
非贪婪限定符 |
作用描述 |
* |
*? |
匹配前面的元素0 到多次,非贪婪模式下会尽可能少匹配 |
+ |
+? |
匹配前面的元素1 到多次,非贪婪模式下会尽可能少匹配 |
? |
?? |
匹配前面的元素0 到 1 次,非贪婪模式下会尽可能少匹配 |
{n,} |
{n,}? |
匹配前面的元素至少 n 次(n 到多次),非贪婪模式下会尽可能少匹配 |
{n,m} |
{n,m}? |
匹配前面的元素n 到 m 次,非贪婪模式下会尽可能少匹配 |
let str = '<div class="box" id="box"><span>123</span></div>123';
// 贪婪匹配
let reg1 = /<div.*>/;
console.log(reg1.exec(str));
// 匹配整个div及其内容
// 非贪婪匹配
let reg2 = /<div.*?>/;
console.log(reg2.exec(str));
// 只匹配开始的div标签
正则预查(零宽断言)
正向预查
正向预查用于判断目标内容的后面是否符合指定模式,本身不匹配具体内容(零宽),包括两种类型:
| 类型 |
语法 |
说明 |
| 正向肯定预查 |
(?=) |
匹配 “后面紧跟着指定模式” 的内容(即内容 + 后续指定模式同时存在) |
| 正向否定预查 |
(?!) |
匹配 “后面不跟着指定模式” 的内容(即内容存在,且后续无指定模式) |
反向预查
反向预查用于判断目标内容的前面是否符合指定模式,同样不匹配具体内容(零宽),包括两种类型:
| 类型 |
语法 |
说明 |
| 反向肯定预查 |
(?<=) |
匹配 “前面是指定模式” 的内容(即前面指定模式 + 内容同时存在) |
| 反向否定预查 |
(?<!) |
匹配 “前面不是指定模式” 的内容(即内容存在,且前面无指定模式) |
let str = 'windows2012windows2000windowsXPwindowsVistawindows98windows';
// 正向肯定预查 - 后面带数字的windows
let reg1 = str.match(/windows(?=\d+)/g); // ["windows", "windows",”windows"]
// 正向否定预查 - 后面不带数字的windows
let reg2 = str.match(/windows(?!\d+)/g); // ["windows", "windows", "windows"]
// 反向肯定预查 - 前面带数字的windows
let reg3 = str.match(/(?<=\d+)windows/g); // ["windows", "windows", "windows"]
// 反向否定预查 - 前面不带数字的windows
let reg4 = str.match(/(?<!\d+)windows/g); // ["windows", "windows", "windows"]
字符串方法与正则表达式
1. replace() 方法
- 语法:
字符串.replace(字符串/正则, 替换字符串)
- 特点:使用正则时默认只替换一次,添加
g 标识符可全局替换
let str = '111qwert123yuiopaas456dfghjkzxc789vb000nm';
// 替换字符串
let r1 = str.replace('123', '***');
// 替换第一个匹配项
let r2 = str.replace(/\d{3}/, '***');
// 全局替换所有匹配项
let r3 = str.replace(/\d{3}/g, '***');
2. search() 方法
- 语法:
字符串.search(字符串/正则)
- 返回值:匹配片段的开始索引,未找到返回
-1
let str = '111qwert123yuiopaas456dfghjkzxc789vb000nm';
let r1 = str.search('yu'); // 11
let r2 = str.search('y0u'); // -1
let r3 = str.search(/a{2}/); // 16
3. match() 方法
- 语法:
字符串.match(字符串/正则)
- 返回值:
- 参数为字符串或无
g 的正则:与 exec() 相同
- 参数为有
g 的正则:返回所有匹配项的数组
let str = '111qwert123yuiopaas456dfghjkzxc789vb000nm';
let r1 = str.match('123'); // ["123"]
let r2 = str.match(/\d{3}/); // ["123"]
let r3 = str.match(/\d{3}/g); // ["111", "123", "456", "789", "000"]
所有评论(0)