跳到主要内容

基本引用类型

基本概念

分类
  • 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
  • 无法显式访问;
  • 所有可以被全局访问的变量和函数为其属性;
属性
属性描述属性描述
undefinedThe special value undefinedRegExpConstructor for RegExp
NaNThe special value wesSymbolPseudo-constructor for Symbol
InfinityThe special value InfinityErrorConstructor for Error
ObjectConstructor for objectEvalErrorConstructor for EvalError
ArrayConstructor for ArrayRangeErrorConstructor for RangeError
FunctionConstructor for FunctionReferenceErrorConstructor for ReferenceError
BooleanConstructor for BooleanSyntaxErrorConstructor for syntaxError
StringConstructor for stringTypeErrorConstructor for TypeError
NumberConstructor for NumberURIErrorConstructor for URIError
DateConstructor 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.Ee
Math.LN10ln10
Math.LN2ln2
Math.LOG10Elog10elog_{10} e
Math.LOG2Elog2elog_2 e
Math.PIPI
Math.SQRT1_212\frac{1}{\sqrt{2}}
Math.SQRT22\sqrt{2}
常用 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();
  • 若无必须,不推荐使用;
// 创建 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);
}