内置对象及垃圾回收机制GC

ECMA-262对内置对象的定义是:由ECMAscript实现提供的,不依赖宿主环境的对象,这些对象在ECMAscrpt程序执行之前就已经存在了。意思就是说,开发人员不必显示地实例化内置对象;因为她们呢已经实例化了。ECMA-262只定义了两个内置对象,Global和math。

 

  一、Global对象

      Global(全局)对象时ECMAscript中一个特别的对象,因为这个对象是不存在的,在ECMAscript中不属于任何其他对象的属性和方法,都属于它的属性和方法。所以,事实上,并不存在全局变量和全局函数;所有在全局作用域定义的变量和函数,都是Global对象的属性和方法。

  PS:因为ECMAscript没有定义怎么调用Global对象,所以,Global.属性或者Global.方法()都是无效的(web浏览器将Global作为window对象的一部分加以实现)

  Global对象有一些内置的属性和方法:

    1.URI编码方法

      URI编码可以对连接进行编码,以便发送给浏览器,他们采用特殊的UTF-8编码替换所有无效的字符,从而让浏览器能够接受和理解。  

      encodeURI()不会对本身属于URL的特殊字符进行编译,例如 冒号 正斜杠、问号和#号

而encodeComponent()则会对它发现的任何非标准字符进行不编码

 

var box="//lee 杜伟";
alert(encodeURI(box));   ////lee没有转换   中文转换了  注意是URI  不是URL
alert(encodeURIComponent(box));   //特殊字符和中文编码了

PS:因为encodeURIComponent()编码比encodeURI编码来的更加彻底,一般来说encodeURIComponent使用频率更高一些

  使用了URI编码过后,还可以进行解码,通过decodeURI和decodeURIComponent()来进行解码

 

var box="//lee 杜伟";
var b=encodeURI(box);   ////lee没有转换   中文转换了  注意是URI  不是URL
alert(encodeURIComponent(box));   //特殊字符和中文编码了
alert(decodeURI(b));                //解码成功

PS:URI方法如上所述的四种,用于代替已经被ECMA-262第三版废弃的escape()和unescape()方法。URI方法能够编码所有的Unicodde字符,而原来的只能正确地编码ASCII字符。所以建议不要在使用escape()和unescape()方法

  2.eval()方法

    eval()方法主要担当一个字符串解析器的作用,它只接收一个参数,而这个参数就是要执行的javascript代码的字符串。

// "var box=100;";      //这是一个字符串
// alert(box);            //出错,因为你没有定义box变量  系统找不到

eval("var box=100;");     //使用eval解析器
alert(box);                    //解析成功  输出100

alert("alert(100)");        //打印alert(100)
eval("alert(100)");            //返回100 解析成功

eval('function box(){return 123}');     //函数也是可以的
alert(box());
//eval方法可以拼接javascript代码,字符串解析成代码

eval方法功能很强大,但也非常危险,因此使用的时候必须极为谨慎,特别是在用户输入数据的情况下,非常有可能导致程序的安全性,比如代码注入等等。

  3.Global对象属性

    Global对象包含了一些属性,undefined、NaN、Object、Array、Function等等

alert(Array);     //返回Array构造方法

 

  4.window对象

    之前已经说明了,Global没有办法直接访问,为web浏览器可以使用window对象来实现--全局访问

alert(window.Array);

  二、Math对象

    ECMAscript还为保存数学公式和信息提供了一个对象,即Math对象,与我们在javascript直接编写计算功能相比,Math对象提供的计算执行起来要快的多。

  1.Math对象的属性

    Math对象包含的属性大都是数学计算中可能会用到一些特殊的值

    Math.E            自然对数的底数,即常量e的值

    Math.LN10            10的自然对数

    Math.LN2           2的自然对数

    Math.LOG2E          以2为底e的对数

    Math.PI            π的值

    Math.SQRT1_2          1/2的平方根

    Math.SQRT2          2的平方根

alert(Math.PI);      //圆周率

  2.min()和max()方法

    Math.min()用于确定一组数值中的最小值。Math.max()用于确定一组数值中最大的值

      

alert(Math.min(1,4.5,6.7,5));            //最小值
alert(Math.max(2,34,5,32,2,5,2,3,423));    //最大值

  3.舍入方法

     Math.ceil()执行向上舍入,即他总是将数值向上舍入为最接近的整数

     Math.floor()执行向下舍入,即他重视将数值向下舍入为最接近的整数

     Math.round()执行标准舍入,即他总是将数值四舍五入为最接近的整数

 

  4.random()方法

    Math.random()方法返回介于0到1之间一个随机数,不包括0和1,如果想大于这个范围的画,可以套用下一个公式:

    值=Math.floor(Math.random()*总数+第一个值)

    

alert(Math.floor(Math.random()*10+1));  //随机产生1-10之间的任意数
alert(Math.floor(Math.random()*10+1));            
//随机产生1-10之间的任意数
//理解:    Math.random()  是随机产生0-1之间不包含0和1的数    
//乘以10是总数
//加上1最小的从1开始
//Math.floor()向下舍入
// 产生0-1之间10个随机数
for (var i=0;i<=9;i++) {
    document.write(Math.random())
    document.write("<br>");
}


//产生1-10之间10个随机数
for (var i=0;i<=9;i++) {
    document.write(Math.floor(Math.random()*10+1))
    document.write("<br>");
}

//产生5-10之间10个随机数,多少随机数=6+5-1;
for(var i=0;i<=9;i++){
    document.write(Math.floor(Math.random()*6+5));    //6+5-1=10
    document.write("</br>");
}


//使用函数产生随机数
function select(start,end){
    var sum=end+start-1;
    for(var i=start;i<=sum;i++){
        document.write(Math.floor(Math.random()*sum+start));
        document.write("</br>");
    }
    
}

select(1,20);

                其他方法

    Math.abs(num)          返回num的绝对值

    Math.exp(num)          返回Math.E的num次幂

    Math.log(num)          返回num的自然对数

    Math.pow(num,power)        返回num的power次幂

    Math.sqrt(num)          返回num的平方根

    Math.acos(x)           返回x的反余弦值

    Math.asin(x)            返回x的反正弦值

    Math.atan(x)            返回x的反正切值

    Math.atan2(y,x)          返回y/x的反正切值

    Math.cos(x)             返回x的余弦值

    Math.sin(x)            返回x的正弦值

    Math.tan(x)            返回x的正切值

 

堆栈溢出  当存储的数据达到某一限制时就会造成堆栈溢出

  内存泄漏,当不断的向堆中存储数据,而不进行清理,这就是内存泄漏

 

垃圾回收

  语言中一般分为两种,一种是自动清理,一种是手动清理gc,js只有自动清理

  垃圾回收机制就是将引用堆中渎职的对象设置null,并且将所有引用该地址的对象都设置为null

  不会即时清除,垃圾回收车会根据内存的情况在适当的时候清楚对中的孤儿对象

 

如:

  

var obj{
      a:"duwei",
      b:30
    
}

//创建对象obj 在桟中 obj 存储的时候 堆中a:"duwei" b:30 的地址

当obj =null 的时候,堆中的数据没有在桟中被引用(孤儿) 垃圾就回收了
如果 obj1=obj;  obj=null 也不会被回收  因为obj1在引用

 

posted @ 2018-12-04 15:36  WhiteSpace  阅读(280)  评论(0编辑  收藏  举报