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. 取消任务:clearTimeoutclearInterval

  • clearTimeout(timerId):取消setTimeout创建的延时任务。
  • clearInterval(timerId):取消setInterval创建的周期性任务。

注意:必须保存定时器 ID 才能取消任务,否则任务会一直执行(可能导致内存泄漏)。

正则表达式

基本概念

  • 数据类型:Regular Expression(正则表达式),属于复杂数据类型
  • 作用:按特定语法规则创建模式,用于验证字符串是否符合规则

正则表达式的创建方式

  1. 字面量方式javascript运行let 变量名 = /正则符号/;
  2. 内置构造函数方式javascript运行let 变量名 = new RegExp('正则符号');

常用方法

  1. test () - 匹配方法
    • 语法:正则.test(要检测的字符串)
    • 返回值:布尔值(true表示符合规则,false表示不符合)
  2. 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 个分组的内容(需完全一致)

  • 示例:\1表示重复第一个分组的内容

标识符

符号 含义 说明
i 忽略大小写 匹配时不区分大小写
g 全局匹配 匹配所有符合条件的结果

应用示例

  1. HTML 标签匹配javascript运行let reg = /^<(p|span)><\/\1>$/i; console.log(reg.test('<P></p>')); // true console.log(reg.test('<p></span>')); // false
  2. 复杂模式匹配javascript运行let reg = /^[1234](a|b|c|d)##(111|222|333)\2@@\1{2}$/; console.log(reg.test('1a##111111@@aa')); // true

注意事项

  1. 正则中的特殊字符需用\转义
  2. ()分组时,可通过\数字引用分组内容
  3. |操作符优先级较低,通常需与()配合使用
  4. 字符范围[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"]

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新

更多推荐