第 5 章 基本引用类型



前言

虽然之前在课堂上已经学过 JavaScript 的相关用法了,但是现在要开始找工作的时候才发现好多知识点都忘记了(正所谓基础不牢,地动山摇😂),而且有些知识点学校教材上都没有,便有了要写这个 JavaScript 学习系列文章的想法。

由于博主只是做知识点总结与学习笔记分享,导致本系列文章对于 JavaScript 的使用方面介绍较少,还望读者能够自己多勤学苦练。废话不多说,让我们开始第 5 章 基本引用类型 的学习吧。


一、Date

要创建日期对象,就使用 new 操作符来调用 Date 构造函数:

let now = new Date(); 

要基于其他日期和时间创建日期对象,必须传入其毫秒表示(UNIX 纪元 1970 年 1 月 1 日午夜之后的毫秒数)ECMAScript为此提供了两个辅助方法:Date.parse()Date.UTC()

ECMAScript 还提供了 Date.now()方法,返回表示方法执行时日期和时间的毫秒数。

1.继承的方法

与其他类型一样,Date 类型重写了 toLocaleString()toString()valueOf()方法。但与其他类型不同,重写后这些方法的返回值不一样。Date 类型的 toLocaleString()方法返回与浏览器运行的本地环境一致的日期和时间。这通常意味着格式中包含针对时间的 AM(上午)或 PM(下午),但不包含时区信息(具体格式可能因浏览器而不同)。toString()方法通常返回带时区信息的日期和时间,而时间也是以 24 小时制(0~23)表示的。

2.日期格式化方法

Date 类型有几个专门用于格式化日期的方法,它们都会返回字符串:

  • toDateString()显示日期中的周几、月、日、年(格式特定于实现);
  • toTimeString()显示日期中的时、分、秒和时区(格式特定于实现);
  • toLocaleDateString()显示日期中的周几、月、日、年(格式特定于实现和地区);
  • toLocaleTimeString()显示日期中的时、分、秒(格式特定于实现和地区);
  • toUTCString()显示完整的 UTC 日期(格式特定于实现)。

这些方法的输出与 toLocaleString()toString()一样,会因浏览器而异。因此不能用于在用户界面上一致地显示日期。

3.日期/时间组件方法

Date 类型剩下的方法(见下表)直接涉及取得或设置日期值的特定部分。注意表中“UTC 日期”,指的是没有时区偏移(将日期转换为 GMT)时的日期。

方法说明
getTime()返回日期的毫秒表示;与 valueOf()相同
setTime(milliseconds)设置日期的毫秒表示,从而修改整个日期
getFullYear()返回 4 位数年(即 2019 而不是 19)
setFullYear(year)设置日期的年(year 必须是 4 位数)
getMonth()返回日期的月(0 表示 1 月,11 表示 12 月)
setMonth(month)设置日期的月(month 为大于 0 的数值,大于 11 加年)
getDate()返回日期中的日(1~31)
setDate(date)设置日期中的日(如果 date 大于该月天数,则加月)
getDay()返回日期中表示周几的数值(0 表示周日,6 表示周六)
getTimezoneOffset()返回以分钟计的 UTC 与本地时区的偏移量(如美国 EST 即“东部标准时间”返回 300,进入夏令时的地区可能有所差异)

注:还有一些返回/设置时、分、秒、毫秒的函数这里就不一一列出了,使用方法基本与上面列出的方法类似,如果在日期/时间单词之前加一个UTC,即可返回UTC日期。

二、RegExp

ECMAScript 通过 RegExp 类型支持正则表达式。正则表达式使用类似 Perl 的简洁语法来创建:

let expression = /pattern/flags; 

这个正则表达式的 pattern(模式)可以是任何简单或复杂的正则表达式,包括字符类、限定符、分组、向前查找和反向引用。每个正则表达式可以带零个或多个 flags(标记),用于控制正则表达式的行为。下面给出了表示匹配模式的标记。

  • g:全局模式,表示查找字符串的全部内容,而不是找到第一个匹配的内容就结束。
  • i:不区分大小写,表示在查找匹配时忽略 pattern 和字符串的大小写。
  • m:多行模式,表示查找到一行文本末尾时会继续查找。
  • y:粘附模式,表示只查找从 lastIndex 开始及之后的字符串。
  • u:Unicode 模式,启用 Unicode 匹配。
  • s:dotAll 模式,表示元字符.匹配任何字符(包括\n 或\r)。

与其他语言中的正则表达式类似,所有元字符在模式中也必须使用反斜杠(\)转义,包括:

( [ { \ ^ $ | ) ] } ? * + . 

1.RegExp 实例属性

每个 RegExp 实例都有下列属性,提供有关模式的各方面信息。

  • global:布尔值,表示是否设置了 g 标记。
  • ignoreCase:布尔值,表示是否设置了 i 标记。
  • unicode:布尔值,表示是否设置了 u 标记。
  • sticky:布尔值,表示是否设置了 y 标记。
  • lastIndex:整数,表示在源字符串中下一次搜索的开始位置,始终从 0 开始。
  • multiline:布尔值,表示是否设置了 m 标记。
  • dotAll:布尔值,表示是否设置了 s 标记。
  • source:正则表达式的字面量字符串(不是传给构造函数的模式字符串),没有开头和结尾的斜杠。
  • flags:正则表达式的标记字符串。始终以字面量而非传入构造函数的字符串模式形式返回(没有前后斜杠)

2.RegExp 实例方法

RegExp 实例的主要方法是 exec(),主要用于配合捕获组使用。这个方法只接收一个参数,即要应用模式的字符串。如果找到了匹配项,则返回包含第一个匹配信息的数组;如果没找到匹配项,则返回 null。返回的数组虽然是 Array 的实例,但包含两个额外的属性:index 和 input。index 是字符串中匹配模式的起始位置,input 是要查找的字符串。这个数组的第一个元素是匹配整个模式的字符串,其他元素是与表达式中的捕获组匹配的字符串。如果模式中没有捕获组,则数组只包含一个元素。

正则表达式的另一个方法是 test(),接收一个字符串参数。如果输入的文本与模式匹配,则参数返回 true,否则返回 false。这个方法适用于只想测试模式是否匹配,而不需要实际匹配内容的情况。test()经常用在 if 语句中。

注意:正则表达式的 valueOf()方法返回正则表达式本身。

3.RegExp 构造函数属性

RegExp 构造函数本身也有几个属性。(在其他语言中,这种属性被称为静态属性。)这些属性适用于作用域中的所有正则表达式,而且会根据最后执行的正则表达式操作而变化。这些属性还有一个特点,就是可以通过两种不同的方式访问它们。换句话说,每个属性都有一个全名和一个简写。下表列出了 RegExp 构造函数的属性。

全名简写说明
input$_最后搜索的字符串(非标准特性)
lastMatch$&最后匹配的文本
lastParen$+最后匹配的捕获组(非标准特性)
leftContext$`input 字符串中出现在 lastMatch 前面的文本
rightContext$’input 字符串中出现在 lastMatch 后面的文本

注意:RegExp 构造函数的所有属性都没有任何 Web 标准出处,因此不要在生产环境中使用它们。

4.模式局限

虽然 ECMAScript 对正则表达式的支持有了长足的进步,但仍然缺少 Perl 语言中的一些高级特性。下列特性目前还没有得到 ECMAScript 的支持(想要了解更多信息,可以参考 Regular-Expressions.info 网站):

  • \A 和\Z 锚(分别匹配字符串的开始和末尾)
  • 联合及交叉类
  • 原子组
  • x(忽略空格)匹配模式
  • 条件式匹配
  • 正则表达式注释

虽然还有这些局限,但 ECMAScript 的正则表达式已经非常强大,可以用于大多数模式匹配任务。

三、原始值包装类型

为了方便操作原始值,ECMAScript 提供了 3 种特殊的引用类型:Boolean、Number 和 String。这些类型具有本章介绍的其他引用类型一样的特点,但也具有与各自原始类型对应的特殊行为。

每种包装类型都映射到同名的原始类型。每当用到某个原始值的方法或属性时,后台都会创建一个相应原始包装类型的对象,从而暴露出操作原始值的各种方法。涉及原始值的语句执行完毕后,包装对象就会被销毁。

1.Boolean

Boolean 是对应布尔值的引用类型。要创建一个 Boolean 对象,就使用 Boolean 构造函数并传入 true 或 false,如下例所示:

let booleanObject = new Boolean(true);

Boolean 的实例会重写 valueOf()方法,返回一个原始值 true 或 false。toString()方法被调用时也会被覆盖,返回字符串"true"或"false"。不过,Boolean 对象在 ECMAScript 中用得很少。

2.Number

Number 是对应数值的引用类型。要创建一个 Number 对象,就使用 Number 构造函数并传入一个数值,如下例所示:

let numberObject = new Number(10); 

与 Boolean 类型一样,Number 类型重写了 valueOf()toLocaleString()toString()方法。valueOf()方法返回 Number 对象表示的原始数值,另外两个方法返回数值字符串。toString()方法可选地接收一个表示基数的参数,并返回相应基数形式的数值字符串。

除了继承的方法,Number 类型还提供了几个用于将数值格式化为字符串的方法。
toFixed()方法返回包含指定小数点位数的数值字符串。

toExponential(),返回以科学记数法(也称为指数记数法)表示的数值字符串,toExponential()也接收一个参数,表示结果中小数的位数。

toPrecision()方法会根据情况返回最合理的输出结果,可能是固定长度,也可能是科学记数法形式。这个方法接收一个参数,表示结果中数字的总位数(不包含指数)。

isInteger()方法与安全整数
ES6 新增了 Number.isInteger()方法,用于辨别一个数值是否保存为整数。

IEEE 754 数值格式有一个特殊的数值范围,在这个范围内二进制值可以表示一个整数值。这个数值范围从 Number.MIN_SAFE_INTEGER(-2^53 + 1)到 Number.MAX_SAFE_INTEGER(2^53 - 1)。对超出这个范围的数值,即使尝试保存为整数,IEEE 754 编码格式也意味着二进制值可能会表示一个完全不同的数值。为了鉴别整数是否在这个范围内,可以使用 Number.isSafeInteger()方法。

3.String

String 是对应字符串的引用类型。要创建一个 String 对象,使用 String 构造函数并传入一个数值,如下例所示:

let stringObject = new String("hello world");

String 对象的方法可以在所有字符串原始值上调用。3个继承的方法 valueOf()toLocaleString()toString()都返回对象的原始字符串值。

每个 String 对象都有一个 length 属性,表示字符串中字符的数量。(注意,即使字符串中包含双字节字符(而不是单字节的 ASCII 字符),也仍然会按单字符来计数。)

  1. JavaScript 字符
    JavaScript 字符串由 16 位码元(code unit)组成。对多数字符来说,每 16 位码元对应一个字符。换句话说,字符串的 length 属性表示字符串包含多少 16 位码元:

    let message = "abcde"; 
    
    console.log(message.length); // 5
    

    charAt()方法返回给定索引位置的字符,由传给方法的整数参数指定。
    charCodeAt()方法可以查看指定码元的字符编码。这个方法返回指定索引位置的码元值(返回结果是十进制数),索引以整数指定。
    fromCharCode()方法用于根据给定的 UTF-16 码元创建字符串中的字符。这个方法可以接受任意多个数值,并返回将所有数值对应的字符拼接起来的字符串。

  2. normalize() 方法
    某些 Unicode 字符可以有多种编码方式。有的字符既可以通过一个 BMP 字符表示,也可以通过一个代理对表示。比如:

    // U+00C5:上面带圆圈的大写拉丁字母 A 
    console.log(String.fromCharCode(0x00C5)); // Å 
    
    // U+212B:长度单位“埃”
    console.log(String.fromCharCode(0x212B)); // Å 
    
    // U+004:大写拉丁字母 A 
    // U+030A:上面加个圆圈
    console.log(String.fromCharCode(0x0041, 0x030A)); // Å 
    

    为解决字符虽然看起来一样但是不相等的问题,Unicode提供了 4种规范化形式,可以将类似上面的字符规范化为一致的格式,无论底层字符的代码是什么。这 4种规范化形式是:NFD(Normalization Form D)、NFC(Normalization Form C)、NFKD(Normalization Form KD)和 NFKC(Normalization Form KC)。可以使用 normalize()方法对字符串应用上述规范化形式,使用时需要传入表示哪种形式的字符串:“NFD”、“NFC”、“NFKD"或"NFKC”。

  3. 字符串操作方法
    首先是 concat(),用于将一个或多个字符串拼接成一个新字符串。但多数情况下,对于拼接多个字符串来说,使用加号操作符(+)更方便。

    ECMAScript 提供了 3 个从字符串中提取子字符串的方法:slice()substr()substring()。这3个方法都返回调用它们的字符串的一个子字符串,而且都接收一或两个参数。第一个参数表示子字符串开始的位置,第二个参数表示子字符串结束的位置。对 slice()substring()而言,第二个参数是提取结束的位置(即该位置之前的字符会被提取出来)。对 substr()而言,第二个参数表示返回的子字符串数量。任何情况下,省略第二个参数都意味着提取到字符串末尾。与 concat()方法一样,slice()substr()substring()也不会修改调用它们的字符串,而只会返回提取到的原始新字符串值。举个例子:

    let stringValue = "hello world"; 
    console.log(stringValue.slice(3)); // "lo world" 
    console.log(stringValue.substring(3)); // "lo world" 
    console.log(stringValue.substr(3)); // "lo world" 
    console.log(stringValue.slice(3, 7)); // "lo w" 
    console.log(stringValue.substring(3,7)); // "lo w" 
    console.log(stringValue.substr(3, 7)); // "lo worl"
    
  4. 字符串位置方法
    有两个方法用于在字符串中定位子字符串:indexOf()lastIndexOf()。这两个方法从字符串中搜索传入的字符串,并返回位置(如果没找到,则返回-1)。两者的区别在于,indexOf()方法从字符串开头开始查找子字符串,而 lastIndexOf()方法从字符串末尾开始查找子字符串。来看下面的例子:

    let stringValue = "hello world"; 
    console.log(stringValue.indexOf("o")); // 4 
    console.log(stringValue.lastIndexOf("o")); // 7 
    
  5. 字符串包含方法
    ECMAScript 6 增加了 3 个用于判断字符串中是否包含另一个字符串的方法:startsWith()endsWith()includes()。这些方法都会从字符串中搜索传入的字符串,并返回一个表示是否包含的布尔值。它们的区别在于,startsWith()检查开始于索引 0 的匹配项,endsWith()检查开始于索引(string.length - substring.length)的匹配项,而 includes()检查整个字符串:

    let message = "foobarbaz"; 
    console.log(message.startsWith("foo")); // true 
    console.log(message.startsWith("bar")); // false 
    console.log(message.endsWith("baz")); // true 
    console.log(message.endsWith("bar")); // false 
    console.log(message.includes("bar")); // true 
    console.log(message.includes("qux")); // false
    

    startsWith()includes()方法接收可选的第二个参数,表示开始搜索的位置。如果传入第二个参数,则意味着这两个方法会从指定位置向着字符串末尾搜索,忽略该位置之前的所有字符。

    endsWith()方法接收可选的第二个参数,表示应该当作字符串末尾的位置。如果不提供这个参数,那么默认就是字符串长度。如果提供这个参数,那么就好像字符串只有那么多字符一样。

  6. trim() 方法
    ECMAScript 在所有字符串上都提供了 trim()方法。这个方法会创建字符串的一个副本,删除前、后所有空格符,再返回结果。比如:

    let stringValue = " hello world "; 
    let trimmedStringValue = stringValue.trim(); 
    console.log(stringValue); // " hello world " 
    console.log(trimmedStringValue); // "hello world" 
    

    由于 trim()返回的是字符串的副本,因此原始字符串不受影响,即原本的前、后空格符都会保留。

    另外,trimLeft()trimRight()方法分别用于从字符串开始和末尾清理空格符。

  7. repeat() 方法
    ECMAScript 在所有字符串上都提供了 repeat()方法。这个方法接收一个整数参数,表示要将字符串复制多少次,然后返回拼接所有副本后的结果。

    let stringValue = "na "; 
    console.log(stringValue.repeat(16) + "batman"); 
    // na na na na na na na na na na na na na na na na batman
    
  8. padStart() 和 padEnd() 方法
    padStart()padEnd()方法会复制字符串,如果小于指定长度,则在相应一边填充字符,直至满足长度条件。这两个方法的第一个参数是长度,第二个参数是可选的填充字符串,默认为空格(U+0020)。

    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......" 
    

    可选的第二个参数并不限于一个字符。如果提供了多个字符的字符串,则会将其拼接并截断以匹配指定长度。此外,如果长度小于或等于字符串长度,则会返回原始字符串。

  9. 字符串迭代与解构
    字符串的原型上暴露了一个@@iterator 方法,表示可以迭代字符串的每个字符。可以像下面这样手动使用迭代器:

    let message = "abc"; 
    let stringIterator = message[Symbol.iterator](); 
    
    console.log(stringIterator.next()); // {value: "a", done: false} 
    console.log(stringIterator.next()); // {value: "b", done: false} 
    console.log(stringIterator.next()); // {value: "c", done: false} 
    console.log(stringIterator.next()); // {value: undefined, done: true}
    

    在 for-of 循环中可以通过这个迭代器按序访问每个字符:

    for (const c of "abcde") { 
     console.log(c); 
    } 
    // a 
    // b 
    // c 
    // d 
    // e 
    

    有了这个迭代器之后,字符串就可以通过解构操作符来解构了。比如,可以更方便地把字符串分割为字符数组:

    let message = "abcde"; 
    
    console.log([...message]); // ["a", "b", "c", "d", "e"] 
    
  10. 字符串大小写转换
    toLowerCase()toUpperCase()方法是原来就有的方法,与 java.lang.String 中的方法同名。toLocaleLowerCase()toLocaleUpperCase()方法旨在基于特定地区实现。在很多地区,地区特定的方法与通用的方法是一样的。但在少数语言中(如土耳其语),Unicode 大小写转换需应用特殊规则,要使用地区特定的方法才能实现正确转换。通常,如果不知道代码涉及什么语言,则最好使用地区特定的转换方法。

  11. 字符串模式匹配方法
    match()方法接收一个参数,可以是一个正则表达式字符串,也可以是一个 RegExp 对象。match()方法返回的数组与 RegExp 对象的 exec()方法返回的数组是一样的:第一个元素是与整个模式匹配的字符串,其余元素则是与表达式中的捕获组匹配的字符串(如果有的话)。
    另一个查找模式的字符串方法是 search()。这个方法唯一的参数与 match()方法一样:正则表达式字符串或 RegExp 对象。这个方法返回模式第一个匹配的位置索引,如果没找到则返回-1。search()始终从字符串开头向后匹配模式。
    为简化子字符串替换操作,ECMAScript 提供了 replace()方法。这个方法接收两个参数,第一个参数可以是一个 RegExp 对象或一个字符串(这个字符串不会转换为正则表达式),第二个参数可以是一个字符串或一个函数。如果第一个参数是字符串,那么只会替换第一个子字符串。要想替换所有子字符串,第一个参数必须为正则表达式并且带全局标记。
    最后一个与模式匹配相关的字符串方法是 split()。这个方法会根据传入的分隔符将字符串拆分成数组。作为分隔符的参数可以是字符串,也可以是 RegExp 对象。(字符串分隔符不会被这个方法当成正则表达式。)还可以传入第二个参数,即数组大小,确保返回的数组不会超过指定大小。

  12. localeCompare() 方法
    最后一个方法是 localeCompare(),这个方法比较两个字符串,返回如下 3 个值中的一个。
    - 如果按照字母表顺序,字符串应该排在字符串参数前头,则返回负值。(通常是-1,具体还要看与实际值相关的实现。)
    - 如果字符串与字符串参数相等,则返回 0。
    - 如果按照字母表顺序,字符串应该排在字符串参数后头,则返回正值。(通常是 1,具体还要看与实际值相关的实现。)

  13. HTML 方法
    早期的浏览器开发商认为使用 JavaScript 动态生成 HTML 标签是一个需求。因此,早期浏览器扩展了规范,增加了辅助生成 HTML 标签的方法。下表总结了这些 HTML 方法。不过,这些方法基本上已经没有人使用了,因为结果通常不是语义化的标记。

四、单例内置对象

1.Global

Global 对象是 ECMAScript 中最特别的对象,因为代码不会显式地访问它。ECMA-262 规定 Global对象为一种兜底对象,它所针对的是不属于任何对象的属性和方法。事实上,不存在全局变量或全局函数这种东西。在全局作用域中定义的变量和函数都会变成 Global 对象的属性 。本书前面介绍的函数,包括 isNaN()、isFinite()、parseInt()和 parseFloat(),实际上都是 Global 对象的方法。除了这些,Global 对象上还有另外一些方法。

  1. URL 编码方法
    encodeURI()encodeURIComponent()方法用于编码统一资源标识符(URI),以便传给浏览器。有效的 URI 不能包含某些字符,比如空格。使用 URI 编码方法来编码 URI 可以让浏览器能够理解它们,同时又以特殊的 UTF-8 编码替换掉所有无效字符。这两个方法的主要区别是,encodeURI()用于对整个 URI 进行编码,不会编码属于 URL 组件的特殊字符,比如冒号、斜杠、问号、井号,而 encodeURIComponent()用于编码 URI 中单独的组件,会编码它发现的所有非标准字符。

  2. eval() 方法
    eval()这个方法就是一个完整的 ECMAScript 解释器,它接收一个参数,即一个要执行的 ECMAScript(JavaScript)字符串。来看一个例子:

    eval("console.log('hi')"); 
    

    上面这行代码的功能与下一行等价:

    console.log("hi");
    

    通过 eval()定义的任何变量和函数都不会被提升,这是因为在解析代码的时候,它们是被包含在一个字符串中的。它们只是在 eval()执行的时候才会被创建。

    在严格模式下,在 eval()内部创建的变量和函数无法被外部访问。换句话说,最后两个例子会报错。同样,在严格模式下,赋值给 eval 也会导致错误:

    "use strict"; 
    eval = "hi"; // 导致错误
    

    注意:解释代码字符串的能力是非常强大的,但也非常危险。在使用 eval()的时候必须极为慎重,特别是在解释用户输入的内容时。因为这个方法会对 XSS 利用暴露出很大的攻击面。恶意用户可能插入会导致你网站或应用崩溃的代码。

  3. Global 对象属性
    下表列出了所有这些属性。

    属性说明
    undefined特殊值 undefined
    NaN特殊值 NaN
    Infinity特殊值 Infinity
    ObjectObject 的构造函数
    ArrayArray 的构造函数
    FunctionFunction 的构造函数
    BooleanBoolean 的构造函数
    StringString 的构造函数
    NumberNumber 的构造函数
    DateDate 的构造函数
    RegExpRegExp 的构造函数
    SymbolSymbol 的伪构造函数
    ErrorError 的构造函数
    EvalErrorEvalError 的构造函数
    RangeErrorSyntaxError 的构造函数
    ReferenceErrorSyntaxError 的构造函数
    SyntaxErrorSyntaxError 的构造函数
    TypeErrorTypeError 的构造函数
    URIErrorURIError 的构造函数
  4. window 对象
    虽然 ECMA-262 没有规定直接访问 Global 对象的方式,但浏览器将 window 对象实现为 Global对象的代理。因此,所有全局作用域中声明的变量和函数都变成了 window 的属性。来看下面的例子:

    var color = "red"; 
    
    function sayColor() { 
     console.log(window.color); 
    } 
    
    window.sayColor(); // "red" 
    

    另一种获取 Global 对象的方式是使用如下的代码:

    let global = function() { 
     return this; 
    }(); 
    

2.Math

  1. Math 对象属性

    属性说明
    Math.E自然对数的基数 e 的值
    Math.LN1010 为底的自然对数
    Math.LN22 为底的自然对数
    Math.LOG2E以 2 为底 e 的对数
    Math.LOG10E以 10 为底 e 的对数
    Math.PIπ 的值
    Math.SQRT1_21/2 的平方根
    Math.SQRT22 的平方根
  2. min() 和 max() 方法
    min()max()方法用于确定一组数值中的最小值和最大值。这两个方法都接收任意多个参数。

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

    • Math.ceil()方法始终向上舍入为最接近的整数。
    • Math.floor()方法始终向下舍入为最接近的整数。
    • Math.round()方法执行四舍五入。
    • Math.fround()方法返回数值最接近的单精度(32 位)浮点值表示。
  4. random() 方法
    Math.random()方法返回一个 0~1 范围内的随机数,其中包含 0 但不包含 1。对于希望显示随机名言或随机新闻的网页,这个方法是非常方便的。可以基于如下公式使用 Math.random()从一组整数中随机选择一个数:

    number = Math.floor(Math.random() * total_number_of_choices + first_possible_value)
    

    注意:Math.random()方法在这里出于演示目的是没有问题的。如果是为了加密而需要生成随机数(传给生成器的输入需要较高的不确定性),那么建议使用 window.crypto. getRandomValues()。

  5. 其它方法
    Math 对象还有很多涉及各种简单或高阶数运算的方法,如下表所示:

    方法说明
    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 的正切

总结

JavaScript 中的对象称为引用值,几种内置的引用类型可用于创建特定类型的对象。

JavaScript 比较独特的一点是,函数实际上是 Function 类型的实例,也就是说函数也是对象。因为函数也是对象,所以函数也有方法,可以用于增强其能力。

由于原始值包装类型的存在,JavaScript 中的原始值可以被当成对象来使用。有 3 种原始值包装类型:Boolean、Number 和 String。

当代码开始执行时,全局上下文中会存在两个内置对象:Global 和 Math。其中,Global 对象在大多数 ECMAScript 实现中无法直接访问。不过,浏览器将其实现为 window 对象。所有全局变量和函数都是 Global 对象的属性。Math 对象包含辅助完成复杂计算的属性和方法。

以上就是本篇文章的全部内容了,下一篇文章我们将学习“第 6 章 集合引用类型”,如果想要第一时间获取相关文章,欢迎关注博主,并订阅专栏。您的支持与鼓励将成为我不断前行地动力!

最后,如果本篇文章对正在阅读的您有所帮助或启发,请不要吝啬您的点赞收藏评论及分享,这样就有可能帮助到更多的人了。同时也欢迎留下您遇到的问题,让我们一起探讨学习,共同进步!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值