第八篇 单体内置对象 - Math 和 Global

发布时间 2023-03-28 14:21:32作者: caix-1987

单体内置对象

《JavaScript高级程序设计》:由 ECMAScript 实现提供的、不依赖于宿主环境的对象,这些对象在 ECMAScript 程序执行前就已经存在了。

开发人员无需显式地实例化内置对象,因为他们已经实例化了

如 Math 和 Global

Math

Math 是 Javascript 的原生对象,提供各种数学功能。

该对象不是构造函数,不能生成实例

所有的属性和方法都必须在 Math 对象上调用

静态属性

Math 的静态属性,提供以下一些数学常数。

 Math.E : 常数 e  => 2.718281828459045
 
 Math.LN2 : 2 的自然对数 => 0.6931471805599453
 
 Math.LN10 : 10的自然对数 => 2.302585092994046
 
 Math.LOG2E : 以 2 为底的 e 的对数 => 1.4426950408889634
 
 Math.LOG10E : 以 10 为底的 e 的对数 => 0.4342944819032518
 
 Math.PI : 常数 π => 3.141592653589793
 
 Math.SQRT1_2 : 0.5 的平方根 => 0.7071067811865476
 
 Math.SQRT2 : 2 的平方根 => 1.4142135623730951
 
 注意 : 这些属性都是只读的 不能修改

静态方法

Math.abs()
 Math.abs() 方法返回参数值的绝对值
 
 Math.abs(1) => 1
 
 MAth.abs(-1) => 1
Math.max()
 Math.max() 方法返回参数之中最大的那个值
 
 如果参数为空 Math.max() 返回 -Infinity
 
 Math.max(2,-1,5) => 5
 
 Math.max() => -Infinity
Math.min()
 Math.min() 方法返回参数中最小的那个值
 
 如果参数为空 Math.min() 返回 Infinity
 
 Math.min(2,-1,5) => -1
 
 Math.min() => Infinity
Math.floor()
 Math.floor() 方法返回 小于 或 等于 参数值的最大整数 地板值
 
 Math.floor(3.2) => 3
 
 Math.floor(-3.2) => -4
Math.ceil()
 Math.ceil() 方法返回 大于 或 等于 参数值的最小整数 天花板值
 
 Math.ceil(3.2) => 4
 
 Math.ceil(-3.2) => -3
Math.floor() 结合 Math.ceil() 返回数值的整数部分
 function ToInteger(x) {
     x = Number(x);
     return x > 0 ? Math.floor(x) : Math.ceil(x)
 }
 
 ToInteger(3.2) => 3
 ToInteger(3.5) => 3
 ToInteger(3.8) => 3
 ToInteger(-3.2) => -3
 ToInteger(-3.5) => -3
 ToInteger(-3.8) => -3
Math.round()
  Math.round() 方法用于四舍五入
  
  Math.round(0.1) => 0
  
  Math.round(0.5) => 1
  
  Math.round(0.6) => 1
  
  注意 
  
     它对负数的处理 主要是对 0.5 的处理
     
     Math.round(-1.1) => -1
     
     Math.round(-1.5) => -1
     
     Math.round(-1.6) => -2
Math.random()
  Math.random() 方法返回 0 到 1 之间的一个伪随机数,可能等于 0 ,但是一定小于 1 
  
   Math.random() => 0.7151307314634323
   
   
   用法
   
   1、任意范围的随机数生成函数 如下
   
   function getRandomArbitirary(min,max){
       return Math.random() * (max - min) + min
   }
   
   getRandomArbitirary(1.5,6.5) => 2.4942810038223864
   
   2、任意范围的随机整数生成函数如下
   
   function getRandomInt(min, max) {
       return Math.floor(Math.random() * (max - min + 1)) + min;
   }

   getRandomInt(1, 6) => 5

   3、返回随机字符的例子如下
   
   function random_str(length) {
     var ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
     ALPHABET += 'abcdefghijklmnopqrstuvwxyz';
     ALPHABET += '0123456789-_';
     var str = '';
     for (var i = 0; i < length; ++i) {
       var rand = Math.floor(Math.random() * ALPHABET.length);
       str += ALPHABET.substring(rand, rand + 1);
     }
      return str;
    }

    random_str(6) => "NdQKOr"
Math.pow()
   Math.pow() 方法返回以第一个参数为底数、第二个参数为指数的幂运算值
   
   Math.pow(2,2) => 4
   
   Math.pow(2,3) => 8
   
   计算 圆 面积的方法
   
   let radius = 20
   
   let area = Math.PI * Math.pow(radius,2)
Math.sqrt()
   Math.sqrt() 方法返回参数值的 平方根 如果参数是一个 负值 则 返回 NaN
   
   Math.sqrt(4) => 2
   
   Math.sqrt(-4) => NaN
Math.log()
   Math.log() 方法返回常数 e 为底的自然数值
   
   Math.log(Math.E) => 1
   
   Math.log(10) => 2.302585092994046
   
   如果要计算以10为底的对数,可以先用Math.log求出自然对数,然后除以Math.LN10
   
   求以2为底的对数,可以除以Math.LN2。
   
   Math.log(100)/Math.LN10 => 2
   
   Math.log(8)/Math.LN2 => 3
Math.exp()
   Math.exp() 方法返回常数 e 的参数次方
   
   Math.exp(1) => 2.718281828459045
   
   Math.exp(3) => 20.085536923187668

三角函数方法

Math对象还提供一系列三角函数方法

   Math.sin():返回参数的正弦(参数为弧度值)
   
   Math.cos():返回参数的余弦(参数为弧度值)
   
   Math.tan():返回参数的正切(参数为弧度值)
   
   Math.asin():返回参数的反正弦(返回值为弧度值)
   
   Math.acos():返回参数的反余弦(返回值为弧度值)
   
   Math.atan():返回参数的反正切(返回值为弧度值)
   
   Math.sin(0) => 0
   Math.cos(0) => 1
   Math.tan(0) => 0

   Math.sin(Math.PI / 2) => 1
   Math.asin(1) => 1.5707963267948966
   Math.acos(1) => 0
   Math.atan(1) => 0.7853981633974483

Global

Global(全局)对象是ECMAScript中特殊的一个对象,不管你从什么角度看这个对象都是不存在的

Global对象某种意义上作为一种 “兜底儿对象” 来定义的

换句话说不属于任何其他对象的属性和方法,最终都是它的属性和方法

事实上没有全局变量和全局函数;所有全局作用域中定义的属性和函数,都是Global对象的属性

像 isNaN()、isFinite()、parseFloat()、parseInt() 实际上都是 Global 对象的方法,除此之外,还有

获取方式

 let global = function(){
    return this
 }

URI编码方法

有时候访问自己服务器上的中文名资源,复制网址后粘贴却变成了没有中文的地址

其实这和Global对象的编码方法encodeURI(str)、encodeURIComponent(str)有关

这可以对URI(Uniform Resource Identifiers)进行编码,它们用特殊的字符替换无效的字符,使浏览器可以接受和理解

encodeURI()
 对 整个 uri 进行编码,但不会对本身属于uri的特殊字符进行编码
 
 encodeURI()不会对本身属于URI的特殊字符进行编码,例如:冒号、正斜杠、问号和井号
 
 encodeURI('http://www.yama.gz.cn/resourse/作者.jpeg')
 
 => http://www.yama.gz.cn/resourse/%E4%BD%9C%E8%80%85.jpeg
encodeURIComponent()
 对 uri 中的某一段进行编码,会对任何非标准字符进行编码
 
 encodeURIComponent('http://www.yama.gz.cn/resourse/作者.jpeg')
 
 => http%3A%2F%2Fwww.yama.gz.cn%2Fresourse%2F%E4%BD%9C%E8%80%85.jpeg
decodeURI()
  对 encodeURI() 替换的字符进行解码
  
  decodeURI('"http://www.yama.gz.cn/resourse/%E4%BD%9C%E8%80%85.jpeg"')
  
  => http://www.yama.gz.cn/resourse/作者.jpeg"
decodeURIComponent()
  对 encodeURIComponent() 进行解码
        decodeURIComponent('http://www.yama.gz.cn/resourse/%E4%BD%9C%E8%80%85.jpeg')
  
  => 没问题:http://www.yama.gz.cn/resourse/作者.jpeg
编码解码说明
  对应的两个解码方法有 decodeURI()、decodeURIComponent()
  
  其中 decodeURI() 只能对使用 encodeURI() 编码的字符进行解码
  
  而 decodeURIComponent() 由于他对应的编码方法非常全,所以它可以解码任何特殊字符的编码

eval () 方法

  eval() 方法用于接受一个字符串参数(这个参数可以不用加引号)
  
  这个参数将会作为 JS代码 被执行
  
  这是一个危险的函数,eval可能导致被运行恶意的代码,
  
  并且它本身的速度比较慢
  
  在必须使用的地方可以使用 window.Function() 代替它
  
  (function(){}).constructor === Function
  
  Function 构造函数创建一个新的 Function 对象
  
  直接调用此构造函数可用动态创建函数,但会遇到和 eval 类似的的安全问题和(相对较小的)性能问题。
  
  然而,与 eval 不同的是,Function 创建的函数只能在全局作用域中运行
  
  Function 创建的函数明确只能在全局作用域中运行,所以不用思考太多