基本引用类型
基本概念
分类
- Date;
- RegExp;
- Singleton Built-in objects;
- Math;
- Global Object;
- Primitive Wrapper Types;
- Boolean;
- Number;
- String;
The Date Type
基本概念
- 基本引用类型;
- 储存距离 1970-01-01T00:00:00 (UTC) 的毫秒数;
let now = new Date();
常用 API
Date() 构造函数
- Date(parameters) 构造函数:根据 parameters 创建本地 Date object;
- None:创建空对象;
- value:从 January 1,1970,00:00:00 到某时刻的毫秒数;
- dateString:YYYY-MM-DDTHH:mm:ss.sssZ 即可;
- dateObject:创建副本;
- [year,monthIndex,day,hours,minutes,seconds,milliseconds]:year,month 必选;
- Date.parse(dateString) 静态方法;
- YYYY-MM-DDTHH:mm:ss.sssZ 格式;
- 返回 dateString 对应的世界时至距离 1970-01-01T00:00:00 (UTC) 的毫秒数;
- Date.UTC(year,month,day,hour,second,milliseconds) 静态方法:返回对应世界时至距离 1970-01-01T00:00:00 (UTC) 的毫秒数;
- Date.now() 静态方法:返回当前世界时时间距离 1970-01-01T00:00:00 (UTC) 的毫秒数;
- Date.prototype.toXXX() 方法:输出 Date 为本地时区/本地语言形式//世界时字符串;
- 无前缀:普通形式;
- DateString:截取日期部分;
- ISOString:ISO 8601 标准;
- Json:JSON 形式;
- String:字符串;
- TimeString:截取时间部分;
- Local 前缀:本地语言形式;
- UTC 前缀:使用世界时时区;
- 无前缀:普通形式;
- Date.prototype.getXXX/setXXX():获取/设置本地时间/世界时;
- 无前缀:获取本地时间;
- Date:1 - 31;
- Day:0 - 6;
- FullYear:四位数年份;
- Hours:0 - 23;
- Milliseconds:0 - 999;
- Minutes:0 - 59;
- Month:0 - 11;
- Seconds:0 -59;
- Time:从 January 1,1970,00:00:00 UTC 到当前世界时的毫秒数;
- TimezoneOffset:本地时间与世界时时间的差异 (分钟);
- UTC 前缀:获取世界时时间;
- 无前缀:获取本地时间;
- Date.prototype.valueOf():同 Date.prototype.getTime() 方法;
THE REGEXP TYPE
语法格式
let expression = /pattern/afgls;
let expression = new RegExp(pattern, flags);
匹配模式
// g 匹配全部内容
let pattern1 = /at/g;
// i 忽略大小写
let pattern1 = /at/i;
// m 多行模式
let pattern1 = /at/m;
// y 仅匹配 lastIndex 之后的字符串
let pattern1 = /at/y;
// u 使用 unicode 匹配
let pattern1 = /at/u;
// s 表示 . 匹配任何字符, 包括换行符
let pattern1 = /at/s;
// 匹配模式组合
let pattern1 = /at/gi;
实例属性
let pattern = /\[bc\]at/i;
pattern.global; // 是否设置 g 标记
pattern.ignoreCase; // 是否设置 i 标记
pattern.unicode; // 是否设置 u 标记
pattern.sticky; // 是否设置 y 标记
pattern.dotAll; // 是否设置 s 标记
pattern.multiline; // 是否设置 m 标记
pattern.source; // 正则表达式的字面量字符串, \[bc\]at
pattern.flags; // 正则表达式的标记字符串, i
pattern.lastIndex; // 源字符串搜索的起始位置
实例方法
// RegExp.prototype.exec(str)
// 返回第一个匹配的字符串信息的数组, 反之为 null
let text = "mom and dad and baby";
let pattern = /mom( and dad( and baby)?)?/gi;
// 数组依次为匹配的整个字符串, $n
// index 属性表示匹配字符串的起始位置
// input 为源字符串
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 标记后, 返回下一个匹配数组
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
// RegExp.prototype.test(str)
// 验证 str 是否与模式匹配, 匹配返回 true, 反之为 false
let text = "000-00-0000";
let pattern = /\d{3}-\d{2}-\d{4}/;
if (pattern.test(text)) {
console.log("The pattern was matched.");
}
继承方法
let pattern = new RegExp("\\[bc\\]at", "gi");
console.log(pattern.toString()); // /\[bc\]at/gi
console.log(pattern.toLocaleString()); // /\[bc\]at/gi
console.log(pattern.valueOf()); // pattern 实例本身
单例内置对象
The Global Object
Global object
Global object
- 无法显式访问;
- 所有可以被全局访问的变量和函数为其属性;
属性
属性 | 描述 | 属性 | 描述 |
---|---|---|---|
undefined | The special value undefined | RegExp | Constructor for RegExp |
NaN | The special value wes | Symbol | Pseudo-constructor for Symbol |
Infinity | The special value Infinity | Error | Constructor for Error |
Object | Constructor for object | EvalError | Constructor for EvalError |
Array | Constructor for Array | RangeError | Constructor for RangeError |
Function | Constructor for Function | ReferenceError | Constructor for ReferenceError |
Boolean | Constructor for Boolean | SyntaxError | Constructor for syntaxError |
String | Constructor for string | TypeError | Constructor for TypeError |
Number | Constructor for Number | URIError | Constructor for URIError |
Date | Constructor for Date |
Window Object
Window Object
- 浏览器中 global object 的代理;
- 所有全局作用域的变量和函数都成为 window 的属性;
获取 Global object 的一种方法
// 非严格模式, 普通函数未指定 this 时指向 Global object
let global = (function () {
return this;
})();
eval() 方法
eval() 方法
- eval(string);
- 执行 string 表示的代码;
- 如同 string 表示的代码插入到当前位置;
- 具有 eval() 函数被调用位置的 execute context;
注意
- eval() 中的函数和方法可以被外界调用;
- eval() 中的变量和函数不会被提升;
- eval() 执行完毕后即销毁;
严格模式
- 严格模式中,eval() 中的变量和函数无法被外界调用;
常用 API
- encodeURI(URI) 方法:将 URI 编码为对应 UTF-8 encoding;
- encodeURIComponent(URI):将部分 URI 编码为对应 UTF-8 encoding;
- decodeURI(URI):解析 decodeURI() 创建的 URI;
- decodeURIComponent(URI):解析 decodeURIComponent() 创建的 URI;
不同
// encodeURI() 和 decodeURI() 无法处理属于 URL 的特殊字符, 如 :, #, / 等
// encodeURIComponent() 和 decodeURIComponent 可以处理
// encodeURIComponent 一般用于 URL 中的查询字符串
let uri = "http:// www.wrox.com/illegal value.js#start";
// "http:// www.wrox.com/illegal%20value.js#start"
console.log(encodeURI(uri));
// "http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.js%23start"
console.log(encodeURIComponent(uri));
The Math Object
静态属性
属性 | 描述 |
---|---|
Math.E | e |
Math.LN10 | ln10 |
Math.LN2 | ln2 |
Math.LOG10E | |
Math.LOG2E | |
Math.PI | PI |
Math.SQRT1_2 | |
Math.SQRT2 |
常用 API
- Math.min([value0,value1,。。。,valueN]) 静态方法:返回最小值;
- Math.max([value0,value1,。。。,valueN]) 静态方法:返回最大值;
- Math.floor(x) 静态方法:向下取整;
- Math.trunc(x) 静态方法:向下取整;
- 比 Math.floor() 函数更快更简单;
- Math.ceil(x):静态方法:向上取整;
- Math.round(x) 静态方法:返回最近的整数值;
- Math.fround(doubleFloat)静态方法:返回最近 x 的单精度浮点值;
- Math.random() 静态方法:返回 [0,1) 中的随机数;
- Math.abs(x)静态方法:计算绝对值;
- Math.pow(base,exponent)静态方法:计算 base 为底数,exponent 为指数的指数值;
- Math.exp(x) 静态方法:计算 e 为底数的指数值;
- Math.log(x)静态方法:计算 e 为底数的对数值;
- Math.log2(x)静态方法:计算 2 为底数的对数值;
- Math.log10(x)静态方法:计算 10 为底数的对数值;
- Math.sqrt(x) 静态方法:计算平方根;
- Math.cbrt(x) 静态方法:计算立方根;
- Math.hypot([value0,value1,。。。,valueN]) 静态方法:计算所有参数平方的和的平方根;
- 避免 sqrt() 方法极大极小值溢出的问题;
- Math.sign(x) 静态方法:返回 x 符号;
- Math.trigonometric_functions(x):各种三角函数运算,使用弧度值;
- sin()/cos()/tan();
- asin()/acos()/atan();
- sinh()/cosh()/tanh();
- asinh()/acosh()/atanh();
原始包装类型
基本概念
primitive wrapper types
- Boolean;
- Number;
- String;
机制
- 当 primitive value 被读取时;
- 临时生成一个对应的 primitive wrapper types 的实例;
- 调用其实例方法,使用后销毁;
reference types 和 primitive wrapper types 的区别
- 声明周期不同;
- reference types:跳出所在 scope 之前;
- primitive wrapper types:仅一行;
显式创建 primitive wrapper types
- 使用 Boolean(),Number() 和 String() 构造函数和 new 关键字;
- 使用 Object(arg) 构造函数;
- arg;
- string:视为 String();
- number:视为 Number();
- Boolean:视为 Boolean();
- arg;
- 若无必须,不推荐使用;
// 创建 primitive wrapper types 必须使用 new 关键字
let value = "25";
let number = Number(value); // casting function
console.log(typeof number); // "number"
let obj = new Number(value); // constructor
console.log(typeof obj); // "object"
typeof 和 instanceof 关键字
let falseObject = new Boolean(false);
let falseValue = false;
console.log(typeof falseObject); // object
console.log(typeof falseValue); // boolean
console.log(falseObject instanceof Boolean); // true
console.log(falseValue instanceof Boolean); // false
The Boolean Type
创建 Boolean Type
let booleanObject = new Boolean(true);
let booleanObject = new Boolean(false);
逻辑运算
// Boolean 参与逻辑运算, 作为 object 参与;
let falseObject = new Boolean(false);
let result = falseObject && true;
console.log(result); // true
常用 API
- Boolean(value:any):boolean 构造函数:返回 value 对应的布尔值;
- Boolean.prototype.valueOf():boolean 方法:返回 false 或 true;
- Boolean.prototype.toString():string 方法:返回 "false" 或 "true";
The Number Type
创建 Number Type
let numberObject = new Number(10);
常用 API
- Number(value?:any):number 构造函数:转换 value 为数字;
- Number.prototype.valueOf():number 方法:返回对应数字形式;
- Number.prototype.toString():string 方法:返回对应数字的字符串形式;
- Number.prototype.toFixed(digits:number =0):string 方法:返回保留 digits 为小数的字符串;
- Number.prototype.toExponential():string 方法:同 toFixed() 方法,不过为科学计数法形式;
- Number.prototype.toPrecision():string 方法:根据数字大小选择 toFixed() 或 toExponential() 方法;
- Number.isInteger(number:number):boolean 静态方法:判断 number 是否为 int 类型;
- Number.isSafeInteger(number:number):boolean 静态方法:判断 number 是否为 int 类型且在安全取值范围内;
- Number.isNaN(number:number):boolean 静态方法:判断 number 是否为非数字;
- Number.isFinite(number:number):boolean:静态方法:判断 number 是否为有限值;
- Number.parseInt(string:string,radix?:number | undefined):number 静态方法:转换 string 为对应进制的整数形式;
- Number.parseFloat(string:string):number 静态方法:转换 string 为对应进制的浮点数形式;
The String Type
创建 String Type
let numberObject = new Number(10);
code unit
- 字符串基本单元,16 bit;
- 范围由 U+0000 到 U+FFFF (65535);
code point
- 由一个或者两个 16 bit code units (代理对) 构成;
- 对于两个 16 bit code units 构成的代理对;
- length 属性,charAt(),charCodeAt() 方法依旧将代理对按照两个分离的 16 bit code units 处理;
- fromCharCode(),codePointAt(),fromCodePoint() 合并处理;
常用 API
- String(value?:any):string 构造函数:转换 value 为字符串;
- String.length:number 属性:返回字符串 code unit 数量;
- String.prototype.valueOf():string 方法:返回对应字符串形式;
- String.prototype.toString():string 方法:返回对应字符串形式;
- String.prototype.charAt(pos:number):string 方法:返回 pos 对应字符;
- String.prototype.charCodeAt(index:number):number 方法:返回 pos 对应字符的 code unit;
- String.prototype.charCodeAt(index:number):number 方法:返回 pos 对应字符的 code point;
- String.fromCharCode(。。.codes:number[]):string 静态方法:根据 codes unit 显示对应字符串;
- String.fromCodePoint(。。.codePoints:number[]):string 静态方法:根据 code point 显示对应字符串;
- String.prototype.concat(。。.strings:string[]):string 方法:链接字符串;
- String.prototype.slice(start?:number | undefined,end?:number | undefined):string 方法:取 [indexStart,indexEnd) 切片;
- 可使用负数索引;
- String.prototype.substring(start:number,end?:number | undefined):string 方法:取 [indexStart,indexEnd) 切片;
- String.prototype.indexOf(searchString:string,position?:number | undefined):number 方法:searchString 首次出现时的首个字符索引值;
- String.prototype.lastIndexOf(searchString:string,position?:number | undefined):number 方法:searchString 末次出现时的首个字符索引值;
- String.prototype.startsWith(searchString:string,position?:number | undefined):boolean 方法:是否以 searchString 开头;
- String.prototype.endsWith(searchString:string,endPosition?:number | undefined):boolean 方法:是否以 endsWith 结尾;
- String.prototype.includes(searchString:string,position?:number | undefined):boolean 方法:是否具有 searchString 子串;
- String.prototype.padStart(maxLength:number,fillString?:string | undefined):string 方法:填补字符串开头直至字符串到达指定长度;
- String.prototype.padEnd(maxLength:number,fillString?:string | undefined):string 方法:填补字符串结尾直至字符串到达指定长度;
- String.prototype.toLowerCase():string 方法:转换为小写形式;
- String.prototype.toUpperCase():string 方法:转换为大写形式;
- String.prototype.replace(searchValue:string | RegExp,replaceValue:string):string 方法:替换字符串;
- String.prototype.split(separator:string | RegExp,limit?:number | undefined):string[] 方法:分割字符串;
- String.prototype.match(regexp:string | RegExp):RegExpMatchArray | null 方法:;
- String.prototype.matchAll(regexp:RegExp):IterableIteratorRegExpMatchArray 方法:;
- String.prototype.search(regexp:string | RegExp):number 方法:;
- String.prototype.trim():string 方法:去除字符串空白;
- String.prototype.trimStart():string 方法:去除字符串开头空白;
- String.prototype.trimEnd() 方法:去除字符串末尾空白;
- String.prototype.repeat(count:number):string 方法:重复链接字符串 count 次;
- String.prototype.localeCompare(that:string):number 方法:根据字母表比较两个字符串排列顺序;
- 1:string 在 compareString 之后;
- 0:string 在 compareString 为同一字符串;
- -1:string 在 compareString 之前;
最佳实践
取任意范围内的整数
function selectFrom(lowerValue, upperValue) {
let choices = upperValue - lowerValue + 1;
return Math.floor(Math.random() * choices + lowerValue);
}