单例内置对象

单例内置对象全局只有一个实例,运行程序时会自动生成,无须单独实例化就可以直接使用。

globalThis对象

globalThis 对象是 ECMAScript 的顶层对象,它提供了全局环境,但代码不会显式访问该对象。所有不属于任何对象的内置属性和方法都是 globalThis 对象的属性和方法。前面介绍了 parseInt()、parseFloat()、setTimeout() 和 setInterval () 等函数。实际上,它们都是 globalThis 对象的方法。除此之外,globalThis 对象还有其他属性和方法。

早期的 ECMAScript 并不存在统一的 globalThis 对象,不同的环境拥有不同的顶层对象。在浏览器中,顶层对象是 window,而 Node.js 诞生后,由于 Node.js 位于服务器端,并不存在于窗口中,因此顶层对象是 global,这使得一套代码无法同时在浏览器和 Node.js 环境中运行。

为了解决这个问题,ECMAScript 6 引入了 globalThis 对象,从此无论是在浏览器中还是在 Node.js 中它都是顶层对象。但是,从原理上来说,浏览器中的 globalThis 对象指向 window 对象,而 Node.js 中的 globalThis 对象指向 global 对象,如果在浏览器和 Node.js 中分别执行以下代码,输出结果都将为 true。

console.log(globalThis===window); //在浏览器中执行此行代码,输出true
console.log(globalThis===global); //在Node.js中执行此行代码,输出true

由于 globalThis 对象是全局对象,所有不属于任何对象的内置属性和方法都是 globalThis 对象的属性和方法,其数量众多,因此这里不一一介绍。以下只列举一些前面使用过的属性或方法,可以看出它们本质上都是 globalThis 对象的属性和方法。

console.log(globalThis.NaN);                  //输出NaN
console.log(globalThis.undefined);            //输出NaNundefined
console.log(globalThis.parseInt("1"));        //输出1
console.log(globalThis.parseFloat("1.2"));    //输出1.2
console.log(globalThis.Number("3.3"));        //输出3.3
console.log(globalThis.String(true));         //输出"true"
console.log(new globalThis.Date());           //输出2022-11-28T14:19:59
console.log(new globalThis.RegExp("hello"));  //输出/hello/
console.log(new globalThis.Array(1, 2, 3));   //输出[1,2,3]
globalThis.setTimeout(function () {
    console.log("setTimeout!");               //输出"setTimeout!"
}, 0);
let interval = globalThis.setInterval(function () {
    console.log("setInterval!");              //输出"setInterval!"
    globalThis.clearInterval(interval);
}, 0);
globalThis.Promise
    .resolve("Promise!")                      //输出"Promise!"
    .then(p => console.log(p));

下面将介绍 Math 和 console 对象,它们实际上也是 globalThis 对象的属性,示例代码如下。

//以下代码输出3.141592653589793
globalThis.console.log(globalThis.Math.PI);

Math对象

Math 对象提供了用于数学计算的属性和方法。

Math 对象的属性如表16-6所示,它们主要用于保存数学中的一些特定值。

b16 6
Figure 1. 表16-6 Math对象的属性

Match 对象的方法如表16-7所示,它们主要用于数学计算,以求出特定值。

b16 7
Figure 2. 表16-7 Math对象的方法
b16 7a
b16 7b
b16 7c

Math 对象的方法众多,就不一一列举示例代码了。下面只列举几个常用方法的示例代码。

console.log(Math.abs(-5));        //输出5,-5的绝对值为5
console.log(Math.pow(2,3));       //输出8,2的3次方为8
console.log(Math.sqrt(25));       //输出5,25的平方根为5
console.log(Math.max(1,5,9,2,6)); //输出9,最大数为9
console.log(Math.round(3.4));     //输出3,3.4舍入后为3
//生成minNum~maxNum的随机数
function randomNum(minNum, maxNum) {
    return parseInt(Math.random() * (maxNum - minNum + 1) + minNum);
}
console.log(randomNum(1,100));    //生成1~100的随机数

console对象

在 console 对象出现之前,在代码中经常使用 alert() 方法进行调试,但如果这种调试代码在项目上线时没有清理干净,用户就会在浏览器中看到弹出框。

使用 console 对象可以收集或输出调试信息,这些调试信息既不会被用户察觉,又不会干扰程序的执行,使用起来非常方便。由于 console 对象的输出信息具有不同的格式,因此它更适用于浏览器开发工具,而不是 Node.js 控制台。console 对象包含的方法如表16-8所示。

b16 8
Figure 3. 表16-8 console对象包含的方法