ECMAScript 中,引用类型是把数据和功能组织到一起的结构,经常被人错误地称作“类”。
引用类型虽然有点像类,但跟类并不是一个概念。
5.1 Date
要创建日期对象,就使用 new 操作符来调用 Date 构造函数:
let now = new Date();
Date.parse():返回日期对象;
Date.UTC():返回日期的毫秒表示;参数是年、零起点月数(1 月是 0,2 月是 1,以此类推)、日(1 ~ 31)、时(0 ~ 23)、分、秒和毫秒。这些参数中,前两个参数(年和月)是必需的。
Date.now():返回表示方法执行时日期和时间的毫秒数。
let someDate = new Date(Date.parse("May 23, 2019"));
let someDate = new Date("May 23, 2019");
// 这两行代码得到的日期对象相同。
Date 类型重写了 toLocaleString()、toString() 和 valueOf() 方法;
toLocaleString() 方法返回与浏览器运行的本地环境一致的日期和时间;
toString() 方法通常返回带时区信息的日期和时间,而时间也是以 24 小时制(0~23)表示的;
valueOf() 方法根本就不返回字符串,这个方法被重写后返回的是日期的毫秒表示。
用于格式化日期的方法,它们都会返回字符串:
toDateString()显示日期中的周几、月、日、年(格式特定于实现);toTimeString()显示日期中的时、分、秒和时区(格式特定于实现);toLocaleDateString()显示日期中的周几、月、日、年(格式特定于实现和地区);toLocaleTimeString()显示日期中的时、分、秒(格式特定于实现和地区);toUTCString()显示完整的 UTC 日期(格式特定于实现)。
日期/时间组件方法:
| 方法 | 说明 |
|---|---|
| getTime() | 返回日期的毫秒表示;与 valueOf()相同 |
| setTime(milliseconds) | 设置日期的毫秒表示,从而修改整个日期 |
| getFullYear() | 返回 4 位数年(即 2019 而不是 19) |
| getUTCFullYear() | 设置日期的年(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,则加日) |
5.2 RegExp
ECMAScript 通过 RegExp 类型支持正则表达式。
表示匹配模式的标记:
g:全局模式,表示查找字符串的全部内容,而不是找到第一个匹配的内容就结束。i:不区分大小写,表示在查找匹配时忽略pattern和字符串的大小写。m:多行模式,表示查找到一行文本末尾时会继续查找。y:粘附模式,表示只查找从lastIndex开始及之后的字符串。u:Unicode模式,启用Unicode匹配。s:dotAll模式,表示元字符.匹配任何字符(包括\n或\r)。
RegExp 实例的主要方法是 exec(),主要用于配合捕获组使用。
5.3 原始值包装类型
ECMAScript 提供了 3 种特殊的引用类型:Boolean、Number 和 String。
Boolean
创建一个 Boolean 对象:
let booleanObject = new Boolean(true);
重写 valueOf()方法,返回一个原始值 true 或 false。
toString()方法被调用时也会被覆盖,返回字符串"true"或"false"。
Number
创建一个 Number 对象:
let numberObject = new Number(10);
Number 类型重写了 valueOf()、toLocaleString()和 toString() 。
valueOf()方法返回 Number 对象表示的原始数值,另外两个方法返回数值字符串。
将数值格式化为字符串的方法:
toFixed()方法返回包含指定小数点位数的数值字符串,如:let num = 10;**console.log(num.toFixed(2)); // "10.00"toExponential(),返回以科学记数法表示的数值字符串,如:let num = 10; **console.log(num.toExponential(1)); // "1.0e+1"toPrecision(),该方法接收一个参数,表示结果中数字的总位数(不包含指数)。如:let num = 99; **console.log(num.toPrecision(1)); // "1e+2" console.log(num.toPrecision(2)); // "99" console.log(num.toPrecision(3)); // "99.0"Number.isInteger()方法,用于辨别一个数值是否保存为整数。
toPrecision()方法会根据数值和精度来决定调用toFixed()还是toExponential()
String
创建一个 String 对象:
let stringObject = new String("hello world");
3个继承的方法 valueOf()、toLocaleString()和 toString()都返回对象的原始字符串值。
length:表示字符串字符的数量;charAt():返回给定索引位置的字符,由传给方法的整数参数指定;charCodeAt():查看指定码元的字符编码;fromCharCode():用于根据给定的 UTF-16 码元创建字符串中的字符;codePointAt():从指定码元位置识别完整的码点;
let message = "abcde";
console.log(message.length); // 5
console.log(message.charAt(2)); // "c"
console.log(message.charCodeAt(2)); // 99
console.log(String.fromCharCode(0x61, 0x62, 0x63, 0x64, 0x65)); // "abcde"
console.log(String.fromCharCode(97, 98, 99, 100, 101)); // "abcde"
let message = "ab☺de";
console.log(message.codePointAt(1)); // 98
console.log(message.codePointAt(2)); // 128522
console.log(message.codePointAt(3)); // 56842
console.log(message.codePointAt(4)); // 100
字符串值的操作方法:
-
concat():用于将一个或多个字符串拼接成一个新字符串; -
slice():第一个参数表示子字符串开始的位置,第二个参数表示子字符串结束的位置。 -
substr():第一个参数表示子字符串开始的位置,第二个参数表示返回字符串的数量。将第一个负参数值当成字符串长度加上该值,将第二个负参数值转换为 0。 -
substring():第一个参数表示子字符串开始的位置,第二个参数表示子字符串结束的位置。let stringValue = "hello world"; console.log(stringValue.slice(-3)); // "rld" console.log(stringValue.substring(-3)); // "hello world" console.log(stringValue.substr(-3)); // "rld" console.log(stringValue.slice(3, -4)); // "lo w" console.log(stringValue.substring(3, -4)); // "hel" console.log(stringValue.substr(3, -4)); // "" (empty string)
两个参数是开区间,结束位置不提取
字符串位置方法:
indexOf():从字符串开头开始查找子字符串lastIndexOf():从字符串末尾开始查找子字符串
这两个方法找到则返回位置,没找到则返回 -1。都可以接收可选的第二个参数,表示开始搜索的位置
字符串包含方法
startsWith():检查开始于索引 0 的匹配项;endsWith():检查开始于索引(string.length - substring.length)的匹配项;includes():检查整个字符串;
startsWith()和includes()方法接收可选的第二个参数,表示开始搜索的位置。
trim():删除前、后所有空格符,再返回结果;
trimLeft() 和 trimRight()方法分别用于从字符串开始和末尾清理空格符;
repeat()方法:表示要将字符串复制多少次,然后返回拼接所有副本后的结果;
padStart()和 padEnd()方法:如果小于指定长度,则在相应一边填充字符,直至满足长度条件。这两个方法的第一个参数是长度,第二个参数是可选的填充字符串,默认为空格;
let stringValue = "foo";
console.log(stringValue.padStart(6)); // " foo"
console.log(stringValue.padStart(9, ".")); // "......foo"
console.log(stringValue.padEnd(6)); // "foo "
console.log(stringValue.padEnd(9, ".")); // "foo......"
如果长度小于或等于字符串长度,则会返回原始字符串。
字符串迭代与解构:...
let message = "abcde";
console.log([...message]); // ["a", "b", "c", "d", "e"]
字符串大小写转换
toLowerCase()、toLocaleLowerCase():转换为小写toUpperCase()、toLocaleUpperCase():转换为大写
toLocaleLowerCase() 和 toLocaleUpperCase()方法旨在基于特定地区实现。在很多地区,地区特定的方法与通用的方法是一样的。
字符串模式匹配方法
-
match():接收一个参数,可以是一个正则表达式字符串,也可以是一个RegExp对象。如:let text = "cat, bat, sat, fat"; let pattern = /.at/; // 等价于 pattern.exec(text) let matches = text.match(pattern); console.log(matches.index); // 0 console.log(matches[0]); // "cat" console.log(pattern.lastIndex); // 0 -
search():始终从字符串开头向后匹配模式。let text = "cat, bat, sat, fat"; let pos = text.search(/at/); console.log(pos); // 1 -
replace():第一个参数是字符串,第二个是替换后的字符串
localeCompare():比较两个字符串,如果按照字母表顺序,字符串应该排在字符串参数前头,则返回负值。如果字符串与字符串参数相等,则返回 0。如果按照字母表顺序,字符串应该排在字符串参数后头,则返回正值。
5.4 单例内置对象
Global 对象的方法:isNaN()、isFinite()、parseInt()和 parseFloat()。
URL 编码方法:
encodeURI():不会编码属于 URL 组件的特殊字符,比如冒号、斜杠、问号、 井号encodeURIComponent():会编码它发现的所有非标准字符
encodeURI()和encodeURIComponent()方法用于编码统一资源标识符(URI)
eval():它接收一个参数,即一个要执行的 ECMAScript(JavaScript)字符串;
Global 对象属性:undefined、NaN、Infinity 、Object、Array、Function、Boolean、String、Number、Date、RegExp、Symbol、Error、EvalError、RangeError、ReferenceError、SyntaxError、TypeError、URIError
window 对象:所有全局作用域中声明的变量和函数都变成了 window 的属性;
Math
Math 对象有一些属性,主要用于保存数学中的一些特殊值
min():确定一组数值中的最小值;
max():确定一组数值中的最大值;
用于把小数值舍入为整数的 4 个方法:
Math.ceil():始终向上舍入为最接近的整数Math.floor():方法始终向下舍入为最接近的整数Math.round():方法执行四舍五入Math.fround():方法返回数值最接近的单精度(32 位)浮点值表示
Math.random()方法返回一个 0~1 范围内的随机数,其中包含 0 但不包含 1。