内置对象及垃圾回收机制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在引用