引用值(或者对象)是某个特定引用类型的实例。引用类型是把数据和功能组织到一起的结构,常被误称为“类”。从技术上讲JS是一门面向对象语言,但ECMAScript缺少传统的面向对象编程语言所具备的某些基本结构,包括类和接口。引用类型有时也被称为对象定义,因其描述了自己的对象应有的属性和方法。
对象被认为是某个特定引用类型的实例。新对象通过使用new操作符后跟一个构造函数来创建。
Date类型将日期保存为自协调世界时(UTC, Universal Time Coordinate)时间1970年1月1日午夜(零时)至今所经过的毫秒数。在不给Date构造函数传参的情况下,创建的对象保存当前日期和时间。
与其他类型一样,Date类型重写了toLocaleString()、toString()和valueOf()
let expression = /pattern/flags;
上面正则表达式的pattern(模式)可以是任何简单或复杂的正则表达式,包括字符类、限定符、分组、向前查找和反向引用。每个正则表达式可以带零个或多个flags(标记),用于控制正则表达式的行为。
表示匹配模式的标记:
元字符在模式中必须转义,包括:([{^$|}])?*+.。元字符在正则表达式中都有一种或多种特殊功能,所以要匹配元字符本身就需要用反斜杠转义
// 匹配第一个“bat”或“cat”,忽略大小写
let pattern1 = /[bc]at/i;
// 匹配第一个“[bc]at”,忽略大小写
let pattern2 = /\[bc\]at/i;
// 匹配所有以“at”结尾的三字符组合,忽略大小写
let pattern3 = /.at/i;
// 匹配所有“.at”,忽略大小写
let pattern4 = /\.at/i;
正则表达式也可以使用RegExp构造函数来创建,接收两个参数:模式字符串和(可选的)标记字符串
字面量模式 | 对应的字符串 |
---|---|
/[bc]at/ | "\\[bc\\]at" |
/\.at/ | "\\.at" |
/name\/age/ | "name\\/age" |
RegExp也可以基于已有的正则表达式实例,并可选择性地修改他们的标记
const rel = /cat/g;
console.log(rel); // "/cat/g"
const re2 = new RegExp(rel);
console.log(re2); // "/cat/g"
const re3 = new RegExp(rel, "i");
console.log(re3); // "/cat/i"
exec(),主要用于配合捕获组使用,参数是要应用模式的字符串
let text = "mom and dad and baby";
let pattern = /mom( and dad ( and baby)?)?/gi;
let matches = pattern.exec(text);
console.log(matches.index); // 0
console.log(matches.input); // "mom and dad and baby"
console.log(matches[0]); // "mom and dad and baby"
console.log(matches[1]); // " and dad and baby"
console.log(matches[2]); // " and baby"
如果在模式上设置了g标记,则每次调用exec()都会在字符串中向前搜索下一个匹配项
lastIndex在非全局模式下始终不变
let text = "cat, bat, sat, fat";
let pattern = /.at/g;
let matches = pattern.exec(text);
console.log(matches.index); // 0
console.log(matches[0]); // cat
console.log(pattern.lastIndex); // 3
matches = pattern.exec(text);
console.log(matches.index); // 5
console.log(matches[0]); // bat
console.log(pattern.lastIndex); // 8
matches = pattern.exec(text);
console.log(matches.index); // 10
console.log(matches[0]); // sat
console.log(pattern.lastIndex); // 13
如果模式设置了粘附标记y,则每次调用exec()就只会在lastIndex的位置上寻找匹配项,粘附标记覆盖全局标记
let text = "cat, bat, sat, fat";
let pattern = /.at/y;
let matches = pattern.exec(text);
console.log(matches.index); // 0
console.log(matches[0]); // cat
console.log(pattern.lastIndex); // 3
// 以索引3对应的字符开头找不到匹配项,因此exec()返回null
// exec()没找到匹配项,于是将lastIndex设置为0
matches = pattern.exec(text);
console.log(matches); // null
console.log(pattern.lastIndex); // 0
// 向前设置lastIndex可以让粘附的模式通过exec()找到下一个匹配项
pattern.lastIndex = 5;
matches = pattern.exec(text);
console.log(matches.index); // 5
console.log(matches[0]); // bat
console.log(pattern.lastIndex); // 8
test(),接收一个字符串参数
toLocaleString()和toString()都是返回其字面量的形式
全名 | 简写 | 说明 |
---|---|---|
input | $_ | 最后搜索的字符串(非标准特性) |
lastMatch | $& | 最后匹配的文本 |
lastParen | $+ | 最后匹配的捕获组(非标准特性) |
leftContext | $` | input字符串中出现在lastMatch前面的文本 |
rightContext | $' | input字符串中出现在lastMatch后面的文本 |
- | $1~$9 | 存储最多9个捕获组的匹配项 |
let text = "this has been a short summer";
let pattern = /(.)hort/g;
if (pattern.test(text)) {
console.log(RegExp.input); // this has been a short summer
console.log(RegExp.leftContext); // this has been a
console.log(RegExp.rightContext); // summer
console.log(RegExp.lastMatch); // short 匹配整个正则表达式的上一个字符串
console.log(RegExp.lastParen); // s 捕获组的上一次匹配
}
缺少特性
为了方便操作原始值,ECMAScript提供了3种特殊的引用类型:Boolean、Number和String。每当用到某个原始值的方法或属性时,后台都会创建一个相应的原始包装类型的对象,从而暴露出操作原始值的各种方法。
ECMA-262规定Global对象为一种兜底对象,它所针对的是不属于任何对象的属性和方法。事实上不存在全局变量或全局函数,在全局作用域中定义的变量和函数都会变成Global对象的属性。
属性 | 说明 |
---|---|
undefined | 特殊值undefined |
NaN | 特殊值NaN |
Infinity | 特殊值Infinity |
Object | Object的构造函数 |
Array | Array的构造函数 |
Function | Function的构造函数 |
Boolean | Boolean的构造函数 |
String | String的构造函数 |
Number | Number的构造函数 |
Date | Date的构造函数 |
RegExp | RegExp的构造函数 |
Symbol | Symbol的构造函数 |
Error | Error的构造函数 |
EvalError | EvalError的构造函数 |
RangerError | RangerError的构造函数 |
ReferenceError | ReferenceError的构造函数 |
SyntaxError | SyntaxError的构造函数 |
TypeError | TypeError的构造函数 |
URIError | URIError的构造函数 |
Math对象上提供的计算要比直接在JS中实现快得多,因为Math对象上的计算使用了JS引擎中更高效的实现和处理器命令。精度会因浏览器、操作系统、指令集和硬件而异。
Math对象属性
属性 | 说明 |
---|---|
Math.E | 自然对数的基数e的值 |
Math.LN10 | 10为底的自然对数 |
Math.LN2 | 2为底的自然对数 |
Math.LOG2E | 以2为底e的对数 |
Math.LOG10E | 以10为底e的对数 |
Math.PI | π的值 |
Math.SQRT1_2 | 1/2的平方根 |
Math.SQRT2 | 2的平方根 |
min()和max()
舍入方法
random()
// number = Math.floor(Math.random() * total_number_of_choices + first_possible_value);
// 从1~10选一个
let num = Math.floor(Math.random() * 10 + 1);
// 2~9,可选总数是9,最小可能值是2
let num2 = Math.floor(Math.random() * 9 + 2);
其他方法
方法 | 说明 |
---|---|
Math.abs(x) | 返回x的绝对值 |
Math.exp(x) | 返回Math.E的x次幂 |
MAth.expm1(x) | 返回Math.exp(x)-1 |
Math.log(x) | 返回x的自然对数 |
Math.log1p(x) | 等于1+Math.log(x) |
Math.pow(x, power) | 返回x的power次幂 |
Math.hypot(...nums) | 返回nums中每个数平方和的平方根 |
Math.clz32(x) | 返回32位整数x的前置零的数量 |
Math.sign(x) | 返回表示x符号的1、0、-0或-1 |
Math.trunc(x) | 返回x的整数部分,删除所有小数 |
Math.sqrt(x) | 返回x的平方根 |
Math.cbrt(x) | 返回x的立方根 |
Math.acos(x) | 返回x的反余弦 |
Math.acosh(x) | 返回x的反双曲余弦 |
Math.asin(x) | 返回x的反正弦 |
Math.asinh(x) | 返回x的反双曲正弦 |
Math.atan(x) | 返回x的反正切 |
Math.atanh(x) | 返回x的反双曲正切 |
Math.atan2(y, x) | 返回y/x的反正切 |
Math.cos(x) | 返回x的余弦 |
Math.sin(x) | 返回x的正弦 |
Math.tan(x) | 返回x的正切 |