💙《JavaScript 高级程序与设计》 | 基本引用类型

121 阅读8分钟

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 开始及之后的字符串。
  • uUnicode 模式,启用 Unicode 匹配。
  • sdotAll 模式,表示元字符.匹配任何字符(包括\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 对象属性undefinedNaNInfinityObjectArrayFunctionBooleanStringNumberDateRegExpSymbolErrorEvalErrorRangeErrorReferenceErrorSyntaxErrorTypeErrorURIError

window 对象:所有全局作用域中声明的变量和函数都变成了 window 的属性;

Math

Math 对象有一些属性,主要用于保存数学中的一些特殊值

min():确定一组数值中的最小值; max():确定一组数值中的最大值;

用于把小数值舍入为整数的 4 个方法:

  • Math.ceil():始终向上舍入为最接近的整数
  • Math.floor():方法始终向下舍入为最接近的整数
  • Math.round():方法执行四舍五入
  • Math.fround():方法返回数值最接近的单精度(32 位)浮点值表示

Math.random()方法返回一个 0~1 范围内的随机数,其中包含 0 但不包含 1