JavaScript 中的单例内置对象(Global & Math)


theme: smartblue

ECMA-262 对内置对象的定义是“任何由ECMAScript实现提供,与宿主环境无关,并在ECMAScript 程序开始执行时就存在的对象”。这意味着,开发者不用显示的实例化内置对象,因为他们已经实例化 好了。

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进行编码,比如”www.wrox.com/illegal value.js”.而encodeURIComponent()方法用于编码URI中单独的组件,比如前面URL 中的”illegal value.js”。这两个方法的主要区别是,encodeURI 不会编码属于URL组件的 特殊字符,如冒号,斜杠,问号,井号,二encodeURI Component()会编码他发现的所有非标准字符。

  1. let uri = "http://www.wrox.com/illegal value.js#start";
  2. //http://www.wrox.com/illegal%20value.js#start
  3. console.log(encodeURI(uri));
  4. //http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.js%23start
  5. console.log(encodeURIComponent(uri));

这里使用encodeURI()编码后,除空格被替换为%20之外,没有任何变化。而encodeURIComponent()方法将所有非字母字符都替换成了相应的编码形式。这就是使用encodeURI编码整个URI,但只使用encodeURIComponent()编码那些会追加到已有URI后面的字符串的原因。\
与encodeURI() 和 encodeURIComponent()相对的是decodeURI()和decodeURIComponent().decodeURI()只对使用encodeURI()编码过的字符解码。例如,%20会被退换为空格,但%23不会被替换为井号(#),因为井号不是由encodeURI()替换的。类似的,decodeURIComponent()解码所有被encodeURIComponent()编码的字符,基本上就是解码所有特殊值。

  1. let uri = "http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.js%23start";
  2. //http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.js%23start
  3. console.log(decodeURI(uri));
  4. //http://www.wrox.com/illegal value.js#start
  5. console.log(encodeURIComponent(uri));

2.eval()方法

eval()方法可以说是ECMAScript语言中最强大的。这个方法就是一个完整的ECMAScript解析器,它接收一个参数,即一个要执行的ECNAScript(JavaScript)字符串。\
当解释器发现eval()调用时,会将参数解释为实际的ECMAScript 语句,然后将其插入该位置。\
通过eval()执行的代码属于该调用所在上下文,被执行的代码与该上下文拥有相同的作用域链。\
通过eval()定义的任何变量和函数都不会被提升,这是因为在解析代码的时候,它们是被包含在一个字符串中。
由于eval()的风险性,大部分时间不会使用这个函数。

3.Gobal对象属性

Gobal 对象由很多属性,其中一些前面已经提到过了。像undefined,NaN和Infinity等特殊值都是Global 对象的属性。此外,所有原生引用类型构造函数,比如Object和Function,也都是Gobal 对象的属性。下表列出了Global对象的属性。

属性 说明
undefined 特殊值undefined
NaN 特殊值NaN
Infinity 特殊值Infinity
Object Object的构造函数
Array Array的构造函数
Function Function的构造函数
Boolean Boolean的构造函数
String String 的构造函数
Number Number 的构造函数
Date Date的构造函数
RegExp RegExp的构造函数
Symbol Symbol的伪构造函数
Error Error 的构造函数
EvalError EvalError 的构造函数
RangeError RangeError的构造函数
SyntaxError SyntaxError的构造函数
TypeError TypeError的构造函数
URIError URIError的构造函数

4.window 对象

虽然ECMA-262 没有规定 直接访问Global 对象的方式,但浏览器将window对象实现为Global对象的代理。因此全局作用域中的变量和函数都变成了window对象的属性。

  1. var color = "red";
  2. function sayColor() {
  3. cosole.log(window.color);
  4. }
  5. window.sayColor();// “red”

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

  1. let global = function () {
  2. return this;
  3. }();

这段代码创建一个立即调用的函数表达式,返回了this的值。当一个函数没有明确(通过称为某个对象的方法,或者通过call()/apply())指定this值的情况下执行时,this值等于Global 对象。

Math

ECMAScript 提供了Math 对象作为保存数学公式,信息和计算的地方。Math对象提供了一些辅助计算的属性和方法。\
Math对象上提供的计算要比直接在JavaScript 实现的快的多,因为Math 对象上的计算使用了JavaScript 引擎中更高效的实现和处理器指令。但使用Math计算的问题时精确度会因浏览器,操作系统,指令集和硬件而异。

Math 对象属性

属性 说明
Math.E 自然对数的基数e的值
Math.LN10 10为底的自然数对
Math.LN2 2为底的自然对数
Math.LOG2E 以2为底e的对数
Math.LOG10E 以10为底e的对数
Math.PI pi的值
Math.SQRT1_2 1/2的平方根
Math.SQRT2 2的平方根

min()和max()方法

Math对象也提供了很多付诸执行简单或复杂数据计算的方法。
min()和max()方法用于确定一组数值中的最小值和最大值。这两个方法接收任意多个参数。

  1. let max = Math.max(3,54,32,16);
  2. console.log(max); // 54
  3. let min = Math.min(3,54,32,16);
  4. console.log(min);//3

要知道数组中的最大值和最小值,可以像下面这样使用拓展操作符:

  1. let values = [1,2,3,4,5,5,6,7,8];
  2. let max = Math.max(...values);// 8

3.舍入方法 Math.ceil(),Math.floor(),Math.round(),Math.fround()

Math.ceil(),Math.floor(),Math.round(),Math.fround() 是把小数舍入为整数的4个方法。

Math.ceil()方法始终向上舍入为最接近的整数。

Math.floor() 方法始终向下舍入为最接近的整数。

Math.round() 方法执行四舍五入。

Math.fround()方法返回数值最接近的单精度(32位)浮点值表示。

  1. console.log(Math.ceil(25.9));// 26
  2. console.log(Math.ceil(25.5));// 26
  3. console.log(Math.ceil(25.1));// 26
  4. console.log(Math.round(25.9));// 26
  5. console.log(Math.round(25.5));// 26
  6. console.log(Math.round(25.1));// 25
  7. console.log(Math.fround(0.4));//0.4000000059604645
  8. console.log(Math.fround(0.5));// 0.5
  9. console.log(Math.fround(25.9));// 25.899999618530273
  10. console.log(Math.floor(25.9));// 25
  11. console.log(Math.floor(25.5));// 25
  12. console.log(Math.floor(25.1));// 25

random()方法

Math.random()方法返回一个0~1范围内的随机数,其中包含0 但不包含1。可以基于一下公式使用Math.random()从一组整数种随机选择一个数:

  1. number = Math.floor(Math.random() * totoal_number_of_choices + first_possible_value)

这里使用了Math.floor()方法,因为Math.random()始终返回小数,即便成一个数再加上一个数也是小数。因此,如果想从1~10范围内随机选择一个数,代码就是这样的

  1. let num = Math.floor(Math.random() * 10 + 1);

可以通过下面的通用函数计算出可选总数和最小可能的值:

  1. function selectFrom(lowerValue,upperValue){
  2. let choices = upperValue - lowerValue + 1;
  3. return Math.floor(Math.random() * choices + lowerValue);
  4. }
  5. let num = selectFrom(2,10);
  6. console.log(2,10);

Math的其他方法

方法 说明
Math.abs(x) 返回x的绝对值
Math.exp(x) 返回Math.E的x次幂
Math.expm1(x) 等于Math.exp(x) -1
Math.log(x) 返回x的自然对数
Math.log1p 等于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的正切

文章标签:

原文连接:https://juejin.cn/post/7122380561599397896

相关推荐

JavaScript进阶内容——BOM详解

Vue详解知识概括

叮!您要的‘this绑定规则’来了

JavaScript必须掌握的四大基础知识(数据类型、原型和原型链、闭包、异步 promise)

JavaScript进阶内容——DOM详解

「React进阶」React中没有keepalive?没事!手把手教你从零到一设计并实现一个!

JavaScript基础系列(6):`this`这六种使用方式

回忆曾跨过的坎:详尽解析前端性能优化体系(一)

[教你做小游戏] 只用几行原生JS,写一个函数,播放音效、播放BGM、切换BGM

我在腾讯这一年

趣味Canvas之时钟⏰

Chrome插件开发教程

我的灿烂前端人生

JavaScript 中的单例内置对象(Global & Math)

JavaScript:聊聊作用域、作用域链与它的一些优化

『JavaScript从零开始』防抖与节流

ES6 类聊 JavaScript 设计模式之创建型模式

玩转React基础 Hook

用原生JS写一个简易版的台球

(建议收藏)JS中5个处理树结构数据的常用方法及如何将其发布到npm上的教程讲解