这篇文章继续分享《高程四》第五章的内容。有需要的同学可以跟着看呀。
5.1.2 日期格式化方法
Date 类型有几个专门用于格式化日期的方法,它们都会返回字符串:
toDateString() 显示日期中的周几、月、日、年(格式特定于实现)(以浏览器实际的实现为主);
toTimeString() 显示日期中的时、分、秒和时区(格式特定于实现);
toLocaleDateString() 显示日期中的周几、月、日、年(格式特定于实现和地区);
toLocaleTimeString() 显示日期中的时、分、秒(格式特定于实现);
toUTCString() 显示完整的UTC日期(格式特定于实现)。
这些方法的输出与 toLocaleString() 和 toString() 一样,会因浏览器而异。因此不能用于在用户界面上一致地显示日期。
注意 还有一个方法叫 toGMTString() ,这个方法跟toUTCString() 是一样的,目的是为了向后兼容。不过,规范建议新代码使用 toUTCString() 。
5.1.3 日期/时间组件方法
Date 类型剩下的方法(见下表)直接涉及取得或设置日期值的特定部分。注意表中“UTC日期”,指的是没有时区偏移(将日期转换为GMT)时的日期。
方法 说明 getTime() 返回日期的毫秒表示;与valueOf() 相同 setTime(milliseconds) 设置日期的毫秒表示,从而修改整个日期 getFullYear() 返回4位数年(即2019而不是19) getUTCFullYear() 返回UTC日期的4位数年 setFullYear(year) 设置日期的年( year 必须是4位数) setUTCFullYear(year) 设置UTC日期的年( year 必须是4位数) getMonth() 返回日期的月(0表示1月,11表示12月) getUTCMonth() 返回UTC日期的月(0表示1月,11表示12月)
方法 说明 setMonth(month) 设置日期的月( month 为大于等于0的数值,大于11加年) setUTCMonth(month) 设置UTC日期的月( month 为大于等于0的数值,大于11加年) getDate() 返回日期中的日(1~31) getUTCDate() 返回UTC日期中的日(1~31) setDate(date) 设置日期中的日(如果 date 大于该月天数,则加月) setUTCDate(date) 设置UTC日期中的日(如果date 大于该月天数,则加月) getDay() 返回日期中表示周几的数值(0表示周日,6表示周六)
方法 说明 getUTCDay() 返回UTC日期中表示周几的数值(0表示周日,6表示周六) getHours() 返回日期中的时(0~23) getUTCHours() 返回UTC日期中的时(0~23) setHours(hours) 设置日期中的时(如果 hours大于23,则加日) setUTCHours(hours) 设置UTC日期中的时(如果hours 大于23,则加日) getMinutes() 返回日期中的分(0~59) getUTCMinutes() 返回UTC日期中的分(0~59) setMinutes(minutes) 设置日期中的分(如果minutes 大于59,则加时) setUTCMinutes(minutes) 设置UTC日期中的分(如果minutes 大于59,则加时)
方法 说明 getSeconds() 返回日期中的秒(0~59) getUTCSeconds() 返回UTC日期中的秒(0~59) setSeconds(seconds) 设置日期中的秒(如果seconds 大于59,则加分) setUTCSeconds(seconds) 设置UTC日期中的秒(如果seconds 大于59,则加分) getMilliseconds() 返回日期中的毫秒 getUTCMilliseconds() 返回UTC日期中的毫秒 setMilliseconds(milliseconds) 设置日期中的毫秒 setUTCMilliseconds(milliseconds) 设置UTC日期中的毫秒 getTimezoneOffset() 返回以分钟计的UTC与本地时区的偏移量(如美国EST即“东部标准时间”返回300,进入夏令时的地区可能有所差异)
5.2 RegExp
ECMAScript通过 RegExp 类型支持正则表达式。正则表达式使用类似Perl的简洁语法来创建:
let expression = /pattern/flags;
这个正则表达式的 pattern (模式)可以是任何简单或复杂的正则表达式,包括字符类、限定符、分组、向前查找和反向引用。每个正则表达式可以带零个或多个 flags (标记),用于控制正则表达式的行为。下面给出了表示匹配模式的标记。
g :全局模式,表示查找字符串的全部内容,而不是找到第一个匹配的内容就结束。
i :不区分大小写,表示在查找匹配时忽略 pattern 和字符串的大小写。
m :多行模式,表示查找到一行文本末尾时会继续查找。
y :粘附模式,表示只查找从 lastIndex 开始及之后的字符串。
u :Unicode模式,启用Unicode匹配。
s : dotAll 模式,表示元字符 . 匹配任何字符(包括 \n 或\r )。
使用不同模式和标记可以创建出各种正则表达式,比如:
// 匹配字符串中的所有"at"
let pattern1 = /at/g;
// 匹配第一个"bat"或"cat",忽略大小写
let pattern2 = /[bc]at/i;
// 匹配所有以"at"结尾的三字符组合,忽略大小写
let pattern3 = /.at/gi;
与其他语言中的正则表达式类似,所有元字符在模式中也必须转义,包括:
( [ { \ ^ $ | ) ] } ? * + .
元字符在正则表达式中都有一种或多种特殊功能,所以要匹配上面这些字符本身,就必须使用反斜杠来转义。下面是几个例子:
// 匹配第一个"bat"或"cat",忽略大小写
let pattern1 = /[bc]at/i;
// 匹配第一个"[bc]at",忽略大小写
let pattern2 = /\[bc\]at/i;
// 匹配所有以"at"结尾的三字符组合,忽略大小写
let pattern3 = /.at/gi;
// 匹配所有".at",忽略大小写
let pattern4 = /\.at/gi;
这里的 pattern1 匹配 "bat" 或 "cat" ,不区分大小写([]不转译的时候表示“分组”,也就是匹配b或c)。要直接匹配 "[bc]at" ,左右中括号都必须像 pattern2 中那样使用反斜杠转义。在 pattern3 中,点号表示 "at" 前面的任意字符都可以匹配。如果想匹配 ".at" ,那么要像 pattern4 中那样对点号进行转义。
前面例子中的正则表达式都是使用字面量形式定义的。正则表达式也可以使用 RegExp 构造函数来创建,它接收两个参数:模式字符串和(可选的)标记字符串。任何使用字面量定义的正则表达式也可以通过构造函数来创建,比如:
// 匹配第一个"bat"或"cat",忽略大小写
let pattern1 = /[bc]at/i;
// 跟pattern1一样,只不过是用构造函数创建的
let pattern2 = new RegExp("[bc]at", "i");
这里的 pattern1 和 pattern2 是等效的正则表达式。注意,RegExp 构造函数的两个参数都是字符串。因为 RegExp 的模式参数是字符串,所以在某些情况下需要二次转义。所有元字符都必须二次转义,包括转义字符序列,如 \n ( \ 转义后的字符串是 \\ ,在正则表达式字符串中则要写成 \\\\ )。下表展示了几个正则表达式的字面量形式,以及使用 RegExp 构造函数创建时对应的模式字符串。
字面量模式 对应的字符串 /\[bc\]at/ "\\[bc\\]at" /\.at/ "\\.at" /name\/age/ "name\\/age" /\d.\d{1,2}/ "\\d.\\d{1,2}" /\w\\hello\\123/ "\\w\\\\hello\\\\123"
此外,使用 RegExp 也可以基于已有的正则表达式实例,并可选择性地修改它们的标记:(也就是说,RegExp的参数除了字符串形式的模式和标记外,还可以是正则表达式实例)
const re1 = /cat/g;
console.log(re1); // "/cat/g"
const re2 = new RegExp(re1);
console.log(re2); // "/cat/g"
const re3 = new RegExp(re1, "i");
console.log(re3); // "/cat/i"