跳到主要内容

标准内置对象

一、全局属性

globalThis

全局属性 globalThis 包含全局的 this 值,类似于全局对象(global object)。

Infinity

全局属性 Infinity 是一个数值,表示无穷大。

NaN

全局属性 NaN 是一个表示非数字的值。

undefined

  • 全局属性 undefined 表示原始值 undefined 。
  • 它是一个 JavaScript 的 原始数据类型 。
  • undefined 是全局对象的一个属性。
  • 也就是说,它是全局作用域的一个变量。
  • undefined 的最初值就是原始数据类型 undefined。

二、全局函数

eval()

eval() 函数会将传入的字符串当做 JavaScript 代码进行执行。

console.log(eval('2 + 2'))
// output: 4

console.log(eval(new String('2 + 2')))
// output: 2 + 2

console.log(eval('2 + 2') === eval('4'))
// output: true

isFinite()

  • 该全局 isFinite() 函数用来判断被传入的参数值是否为一个有限数值(finite number)
  • 在必要情况下,参数会首先转为一个数值。

isNaN()

  • isNaN() 函数用来确定一个值是否为 NaN
  • 注:isNaN 函数内包含一些非常有趣的规则;你也可以使用 ECMAScript 2015 中定义的 Number.isNaN() 来判断。

parseFloat()

  • parseFloat() 函数解析一个参数(必要时先转换为字符串)并返回一个浮点数。
function circumference(r) {
return parseFloat(r) * 2.0 * Math.PI
}
console.log(circumference(4.567))
// output: 28.695307297889173
console.log(circumference('4.567abcdefgh'))
// output: 28.695307297889173
console.log(circumference('abcdefgh'))
// output: NaN

parseInt()

  • parseInt(string, radix) 解析一个字符串并返回指定基数的十进制整数,radix2-36 之间的整数,表示被解析字符串的基数。
console.log(parseInt('123'))
// 123 (default base-10)
console.log(parseInt('123', 10))
// 123 (explicitly specify base-10)
console.log(parseInt(' 123 '))
// 123 (whitespace is ignored)
console.log(parseInt('077'))
// 77 (leading zeros are ignored)
console.log(parseInt('1.9'))
// 1 (decimal part is truncated)
console.log(parseInt('ff', 16))
// 255 (lower-case hexadecimal)
console.log(parseInt('0xFF', 16))
// 255 (upper-case hexadecimal with "0x" prefix)
console.log(parseInt('xyz'))
// NaN (input can't be converted to an integer)

decodeURI() 解码

  • decodeURI() 函数能解码由 encodeURI 创建或其他流程得到的统一资源标识符(URI)。
const uri = 'https://mozilla.org/?x=шеллы'
const encoded = encodeURI(uri)
console.log(encoded)
// Expected output: "https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B"

try {
console.log(decodeURI(encoded))
// Expected output: "https://mozilla.org/?x=шеллы"
} catch (e) {
// Catches a malformed URI
console.error(e)
}

encodeURI() 编码

  • encodeURI() 函数通过将特定字符的每个实例替换为一个、两个、三或四转义序列来对统一资源标识符 (URI) 进行编码
  • (该字符的 UTF-8 编码仅为四转义序列) 由两个 "代理" 字符组成)。

decodeURIComponent() 解码

  • decodeURIComponent() 方法用于解码由 encodeURIComponent 方法或者其他类似方法编码的部分统一资源标识符(URI)。

encodeURIComponent() 编码

  • encodeURIComponent() 函数通过将特定字符的每个实例替换成代表字符的 UTF-8 编码的一个、两个、三个或四个转义序列来编码 URI
  • (只有由两个“代理”字符组成的字符会被编码为四个转义序列)。
  • encodeURI() 相比,此函数会编码更多的字符,包括 URI 语法的一部分。

三、基本对象

Object

  • ObjectJavaScript 的一种数据类型。
  • 它用于存储各种键值集合和更复杂的实体。
  • 可以通过 Object() 构造函数或者使用 对象字面量 的方式创建对象。

对象字面量

  • 对象初始化器是一个用大括号({})括起来的以逗号分隔的列表,包含了一个对象的零个或多个属性名称和相关值。
  • 可以通过 Object.create() 方法,或者使用 new 运算符调用其构造函数而初始化一个对象。
const object1 = { a: 'foo', b: 42, c: {} }
console.log(object1.a)
// Expected output: "foo"

对象字面语法与 JSON 的对比

  • 对象字面的语法JavaScript Object Notation(JSON) 不一样。

  • 虽然它们看起来很相似,但它们之间还是有区别的:

    • JSON 只允许使用 "property": value 的语法进行属性定义。
    • 属性名必须是双引号,而且定义不能简写。计算属性名也是不允许的。
    • JSON 对象的属性值只能是字符串、数字、true、false、null、数组或其他 JSON 对象
    • 这意味着 JSON 不能表达方法或非普通对象,
    • DateRegExp 。在 JSON 中,"__proto__" 是一个普通的属性键。在对象字面中,它设置对象的原型。
  • JSON 是对象字面语法的一个真子集,意味着每一个有效的 JSON 文本都可以被解析为对象字面,并且不会引起语法错误。

  • 唯一的例外是,对象字面语法禁止重复的 __proto__ 键,这不适用于 JSON.parse()

  • 后者将 __proto__ 像普通的属性一样对待,并将最后一次出现的对象作为该属性的值。

  • 它们所代表的对象值(也就是它们的语义)唯一不同的时候,也就是当源码包含 __proto__ 键的时候——对于对象字面,它设置对象的原型;对于 JSON,它是一个普通的属性。

Function

  • Function 对象提供了用于处理函数的方法。在 JavaScript 中,每个函数实际上都是一个 Function 对象。

Boolean

  • Boolean 对象是一个布尔值的对象包装器。

Symbol

  • symbol 是一种 基本数据类型(primitive data type) 。

  • Symbol() 函数会返回 symbol 类型的值,该类型具有静态属性和静态方法。

  • 它的静态属性会暴露几个内建的成员对象;

  • 它的静态方法会暴露全局的 symbol 注册,且类似于内建对象类,但作为构造函数来说它并不完整,

  • 因为它不支持语法:"new Symbol()"。

  • 每个从 Symbol() 返回的 symbol 值都是唯一的。

  • 一个 symbol 值能作为对象属性的标识符这是该数据类型仅有的目的

const symbol1 = Symbol()
const symbol2 = Symbol(42)
const symbol3 = Symbol('foo')

console.log(typeof symbol1)
// output: "symbol"

console.log(symbol2 === 42)
// output: false

console.log(symbol3.toString())
// output: "Symbol(foo)"

console.log(Symbol('foo') === Symbol('foo'))
// output: false

四、错误对象

Error

当运行时错误产生时,Error 对象会被抛出。

Error()
Error(message)
Error(message, options)
Error(message, fileName)
Error(message, fileName, lineNumber)

AggregateError

  • AggregateError 对象代表了包装了多个错误对象的单个错误对象。
  • 当一个操作需要报告多个错误时,例如 Promise.any(),当传递给它的所有承诺都被拒绝时,就会抛出该错误。
  • AggregateErrorError 的子类。
创建一个 AggregateError
try {
throw new AggregateError([new Error('some error')], 'Hello')
} catch (e) {
console.log(e instanceof AggregateError) // true
console.log(e.message) // "Hello"
console.log(e.name) // "AggregateError"
console.log(e.errors) // [ Error: "some error" ]
}

EvalError

  • 本对象代表了一个关于 eval() 全局函数的错误。
  • 此异常不再会被 JavaScript 抛出,但是 EvalError 对象仍然存在,以保持兼容性。
  • EvalError 是一个可序列化对象,所以可以使用 structuredClone() 对它进行克隆,也可以使用 postMessage()Worker 之间拷贝它。

RangeError

RangeError 对象表示一个特定值不在所允许的范围或者集合中的错误。

ReferenceError

ReferenceError (引用错误)对象代表当一个不存在(或尚未初始化)的变量被引用时发生的错误。

ReferenceError 是一个可序列化对象,所以可以使用 structuredClone() 对它进行克隆,也可以使用 postMessage()Worker 之间拷贝它。

SyntaxError

SyntaxError (语法错误)对象代表尝试解析不符合语法的代码的错误。当 Javascript 引擎解析代码时,遇到了不符合语法规范的标记(token)或标记顺序,则会抛出 SyntaxError。

SyntaxError 是一个可序列化对象,所以可以使用 structuredClone() 对它进行克隆,也可以使用 postMessage()Worker 之间拷贝它。

TypeError

  • TypeError (类型错误)对象通常(但并不只是)用来表示值的类型非预期类型时发生的错误。
  • 以下情况会抛出 TypeError
    • 传递给运算符的操作数或传递给函数的参数与预期的类型不兼容;
    • 尝试修改无法更改的值;或尝试以不适当的方法使用一个值。
  • TypeError 是一个可序列化对象,所以可以使用 structuredClone() 对它进行克隆,也可以使用 postMessage()Worker 之间拷贝它。

URIError

URIError 对象用来表示以一种错误的方式使用全局 URI 处理函数而产生的错误。

URIError MDN

五、数字和日期

Number

  • Number 值表示像 37-9.25 这样的浮点数。
  • Number 构造函数包含常量和处理数值的方法。其他类型的值可以使用 Number() 函数转换为数字。

格式化数值

Number.toFixed()
function financial(x) {
return Number.parseFloat(x).toFixed(2)
}
console.log(financial(123.456))
// output: "123.46"
console.log(financial(0.004))
// output: "0.00"
console.log(financial('1.23e+5'))
// output: "123000.00"

BigInt

  • BigInt 是一种内置对象,它提供了一种方法来表示大于 2^53 - 1 的整数。

  • 这原本是 Javascript 中可以用 Number 表示的最大数字。

  • BigInt 可以表示任意大的整数。

  • 可以用在一个整数字面量后面加 n 的方式定义一个 BigInt ,如:10n,或者调用函数 BigInt()(但不包含 new 运算符)并传递一个整数值或字符串值。

const theBiggestInt = 9007199254740991n
const alsoHuge = BigInt(9007199254740991)
// ↪ 9007199254740991n
const hugeString = BigInt('9007199254740991')
// ↪ 9007199254740991n
const hugeHex = BigInt('0x1fffffffffffff')
// ↪ 9007199254740991n
const hugeBin = BigInt(
'0b11111111111111111111111111111111111111111111111111111'
)
// ↪ 9007199254740991n

Math

  • Math 是一个内置对象,它拥有一些数学常数属性和数学函数方法。

  • Math 不是一个函数对象。

  • Math 用于 Number 类型。它不支持 BigInt

  • 与其他全局对象不同的是, Math 不是一个构造器。

  • Math 的所有属性与方法都是静态的。

  • 引用圆周率的写法是 Math.PI

  • 调用正余弦函数的写法是 Math.sin(x)x 是要传入的参数。

  • Math 的常量是使用 JavaScript 中的全精度浮点数来定义的。

Date

  • 创建一个 JavaScript Date 实例,该实例呈现时间中的某个时刻。
  • Date 对象则基于 Unix Time Stamp,即自 1970 年 1 月 1 日(UTC) 起经过的毫秒数。

六、字符串

这些对象表示字符串并支持操作字符串。

String

RegExp

七、可索引的集合对象

这些对象表示按照索引值来排序的数据集合,包括数组和类型数组,以及类数组结构的对象。

Array

Int8Array

Uint8Array

Uint8ClampedArray

Int16Array (en-US)

Uint16Array

Int32Array

Uint32Array

BigInt64Array

BigUint64Array (en-US)

Float32Array

Float64Array

八、使用键的集合对象

这些集合对象在存储数据时会使用到键,包括可迭代的 Map 和 Set,支持按照插入顺序来迭代元素。

Map

  • Map 对象保存键值对,并且能够记住键的原始插入顺序。

  • 任何值(对象或者原始值)都可以作为键或值。

  • Map.prototype.size 获得 map 中的元素的数量

const map1 = new Map();

  • map1.clear() 移除所有元素
  • map1.delete(键) 删除指定键的元素
  • map1.entries() 返回一个 map 迭代器对象,该对象包含 map1 中的每个[key,value]对,按插入顺序排列。
  • map1.forEach(function(value,key,map){}) 按插入顺序对该 map 中的每个键/值对执行一次提供的函数。
  • map1.get(键) 获得键值。
  • Map.groupBy() 静态方法使用提供的回调函数返回的值对给定可迭代对象中的元素进行分组, 有浏览器兼容性问题,此方法被实现为 Array.prototype.groupToMap() 方法。
  • map1.has(键) :判断 map 中是否有该键值。返回布尔值
  • map1.keys() :返回 map 所有键的迭代器对象。通过 xxx.next.value,for...of 获得值。
  • map1.set(键,值):赋值
  • map1.values() :与 map1.keys() 类似,只是把 map 的值转出迭代器对象。

Set

  • Set 对象允许你存储任何类型(无论是原始值还是对象引用)的唯一值。
  • Set 对象是值的合集( collection )。
  • 集合(set)中的元素只会出现一次,即集合中的元素是唯一的。
  • 你可以按照插入顺序迭代集合中的元素。
  • 插入顺序对应于 add() 方法成功将每一个元素插入到集合中(即,调用 add() 方法时集合中不存在相同的元素)的顺序。

const set1 = new Set();

  • set1.add(值) 添加值
  • 其他方法同 Map,不同的是 Map 是键值对,Set 只有值

WeakMap

  • 唯一可以作为 WeakMap 的键的类型是非全局注册的符号 Symbol,因为非全局注册的符号是保证唯一的,并且不能被重新创建。
  • 如果你想要可以获取键的列表,你应该使用 Map 而不是 WeakMap。

WeakSet

  • WeakSet 只能是对象和符号的集合,它不能像 Set 那样包含任何类型的任意值。
  • WeakSet 持弱引用:WeakSet 中对象的引用为弱引用。如果没有其他的对 WeakSet 中对象的引用存在,那么这些对象会被垃圾回收。

九、结构化数据

这些对象用来表示和操作结构化的缓冲区数据,或使用 JSON(JavaScript Object Notation)编码的数据。

ArrayBuffer

ArrayBuffer 对象用来表示通用的、固定长度的原始二进制数据缓冲区。

SharedArrayBuffer

SharedArrayBuffer 对象用来表示一个通用的、固定长度的原始二进制数据缓冲区,类似于 ArrayBuffer 对象,它们都可以用来在共享内存(shared memory)上创建视图。与 ArrayBuffer 不同的是,SharedArrayBuffer 不能被转移。

Atomics

Atomics 对象提供了一组静态方法对 SharedArrayBuffer 和 ArrayBuffer 对象进行原子操作。

DataView

DataView 视图是一个可以从二进制 ArrayBuffer 对象中读写多种数值类型的底层接口,使用它时,不用考虑不同平台的字节序(endianness)问题。

JSON

JSON 对象包含两个方法:

  • 用于解析 JavaScript Object Notation(JSON)parse() 方法,
  • 以及将对象/值转换为 JSON 字符串的 stringify() 方法。
  • 除了这两个方法,JSON 这个对象本身并没有其他作用,
  • 也不能被调用或者作为构造函数调用。
  • JavaScript 不是 JSON,JSON 也不是 JavaScript

注意:

  1. 属性名称必须是双引号括起来的字符串;最后一个属性后不能有逗号。
  2. 禁止出现前导零(JSON.stringify 方法自动忽略前导零,而在 JSON.parse 方法中将会抛出 SyntaxError);如果有小数点,则后面至少跟着一位数字。
  3. 只有有限的一些字符可能会被转义;禁止某些控制字符;
  4. 字符串必须用双引号括起来。

十、内存管理对象

这些对象会与垃圾回收机制产生交互。

WeakRef

WeakRef 对象允许你保留对另一个对象的弱引用,而不会阻止被弱引用对象被 GC 回收

FinalizationRegistry (en-US)

FinalizationRegistry 对象允许您在值被垃圾回收时请求回调。

十一、控制抽象对象

控件抽象对象可以帮助构造代码,尤其是异步代码(例如不使用深度嵌套的回调)。

Iterator (en-US)

迭代器,该方法使迭代器本身也可以被迭代。实验性功能

AsyncIterator (en-US)

  • 异步迭代
  • AsyncIterator 对象是一个通过提供 next()方法来符合异步迭代器协议的对象,该方法向迭代器结果对象返回承诺实现。
  • AsyncIterator.prototype 对象是一个隐藏的全局对象,所有内置异步迭代器都从中继承。
  • 它提供了一个@@asyncIterator 方法,该方法返回异步迭代器对象本身,使异步迭代程序也可以异步迭代。

Promise

Promise 对象表示异步操作最终的完成(或失败)以及其结果值。详情

GeneratorFunction

  • 在 JavaScript 中,生成器函数实际上都是 GeneratorFunction 对象。
  • 注意,GeneratorFunction 并不是一个全局对象,但你可以通过下面的代码创建 GeneratorFunction() 构造函数。

AsyncGeneratorFunction

Generator

Generator 对象由生成器函数返回并且它符合可迭代协议和迭代器协议。

AsyncGenerator

  • AsyncGenerator 对象由异步生成器函数返回,并且它符合异步可迭代协议和异步迭代器协议。
  • 异步生成器方法总是产生 Promise 对象。

AsyncFunction

  • AsyncGenerator 对象由异步生成器函数返回,并且它符合异步可迭代协议和异步迭代器协议。
  • 异步生成器方法总是产生 Promise 对象。

十二、反射

Reflect

  • Reflect 是一个内置的对象,它提供拦截 JavaScript 操作的方法。
  • 这些方法与 proxy handler (en-US) 的方法相同。
  • Reflect 不是一个函数对象,因此它是不可构造的。

Proxy

  • Proxy 对象用于创建一个对象的代理,从而实现基本操作的拦截和自定义(如属性查找、赋值、枚举、函数调用等)。

十三、国际化

ECMAScript 核心的附加功能,用于支持多语言处理。

Intl

Intl.Collator

Intl.DateTimeFormat

Intl.DisplayNames

Intl.DurationFormat (en-US)

Intl.ListFormat

Intl.Locale

Intl.NumberFormat

Intl.PluralRules

Intl.RelativeTimeFormat

Intl.Segmenter