JavaScript中本地对象内置对象和宿主对象
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript中本地对象内置对象和宿主对象相关的知识,希望对你有一定的参考价值。
http://www.jianshu.com/p/a52e6e183427
http://blog.csdn.net/weiyastory/article/details/52837466
http://www.cnblogs.com/qigang/p/3520974.html
在ECMAScript中,所有对象并非同等创建的。
一般来说,可以创建并使用的对象有3种:本地对象、内置对象和宿主对象。
1、本地对象
ECMA-262把本地对象(native object)定义为“独立于宿主环境的ECMAScript实现提供的对象”。
何谓宿主环境? “宿主”,生物学上,一般是指寄生的生物体选择的寄生体,如:火影里的“白”(哈哈哈)。此处的宿主环境,简单来说就是用户的机器环境,包括操作系统和浏览器。
本地对象包括如下内容:Object、Function、String、Array、Boolean、Number、Date、 RegExp、Error、EvalError、RangeError、ReferenceError、SyntaxError、TypeError、URIError。由此可知,本地对象是ECMA-2定义的类(引用类型)。
2、内置对象
ECMA-262 把内置对象(built-in object)定义为“由 ECMAScript 实现提供的、独立于宿主环境的所有对象,在 ECMAScript 程序开始执行时出现”。这意味着开发者不必明确实例化内置对象,它已被实例化了。
同样是“独立于宿主环境”。根据定义我们似乎很难分清“内置对象”与“本地对象”的区别。而ECMA-262 只定义了两个内置对象,即 Global 和 Math (它们也是本地对象,根据定义,每个内置对象都是本地对象)。
如此就可以理解了。内置对象是本地对象的一种。而其包含的两种对象中,Math对象我们经常用到,可这个Global对象是啥东西呢?
Global对象是ECMAScript中最特别的对象,因为实际上它根本不存在,但大家要清楚,在ECMAScript中,不存在独立的函数,所有函数都必须是某个对象的方法。类似于isNaN()、parseInt()和parseFloat()方法等,看起来都是函数,而实际上,它们都是Global对象的方法。而且Global对象的方法还不止这些。有关Global对象的具体方法和属性,感兴趣的同学可以看一下这里:JavaScript 全局对象参考手册
3、宿主对象
宿主对象就是执行JS脚本的环境提供的对象。对于嵌入到网页中的JS来说,其宿主对象就是浏览器提供的对象,所以又称为浏览器对象,如IE、Firefox等浏览器提供的对象。不同的浏览器提供的宿主对象可能不同,即使提供的对象相同,其实现方式也大相径庭!这会带来浏览器兼容问题,增加开发难度。
浏览器对象有很多,如Window和Document等等。
1、Global对象
Global(全局)对象是在ECMAScript中是一个特别的对象,因为这个对象是不存在的。在ECMAScript 中任何不属于其他对象的方法和属性都是这个对象的方法和属性。所有事实上并不存在什么全局属性和全局函数,因为一切全局的函数和属性都是这个Global对象的方法和属性。但是由于这个对象并不是真真存在的,并且ECMAScript也没有定义怎样定义和调用这个对象,故所有Global.属性和Global.()都是无效的,但是在WEB浏览器中中把Global对象作为window对象的一部分实现了,故一切的所谓的全局属性和方法都是window对象的方法和属性。
2、URI编码方法--Global对象的内置方法
URI编码方法可以编码连接,以便发送给浏览器,采用特殊的UTF-8编码特殊的不认识的字符,比如在浏览器的地址栏中有汉字的时候,IE显示的结果就是编码的,如果不编码或者编码浏览器不认识,就会显示一个乱码结果就是找不到连接中所要请求的页面
encodeURI(box): 对变量box进行编码,但是这个方法不能够对URI本身特殊字符编码,比如 正斜杠,#,冒号,问号等不会编码,但是会编码汉字等
encodeURIComponent(box): 完全编码,它会将发现的URI中所有的非标准字符进行编码。因为编码彻底,故使用的频率要比不完全编码(encodeURI())方法多很多。
3、URI解码方法--Global对象的内置方法
通过上面两种编码方法进行编码的URI,可以通过解码方法进行解码。然后还原可读的URI
decodeURI(): 用来解码由编码方法 encodeURI()编码的URI
decodeURIComponent(): 用来解码由编码方法 encodeURIComponent() 编码的URI
解码方法和编码方法最好对应的使用,用什么方法编码,就用对应的方法进行解码,否则可能会造成解码不出来或者解码不完整
4、eval 方法--Global对象内置方法
eval()方法是用来担当一个字符串解析器的作用,只是接收一个参数,而这个参数中就是要执行的JS代码,多余的参数会忽略的,此方法可能有返回值也可能没有,要根据参数中的JS代码而定,在AJAX中传递参数的时候很有用。eval()的参数是一个字符串。如果字符串表示的是表达式,eval()会对表达式进行求值。如果参数表示一个或多个javascript语句, 那么eval()就会执行这些语句。注意不要用eval()来执行一个四则运算表达式;因为 JavaScript 会自动为四则运算求值并不需要用eval来包裹。
如果解析的字符串中的JS代码是定义变量,比如说数组对象,字符串等代码,则会返回这些定义结果,并且还原真正的类型;如果是定义一个函数或者调用一个函数,则没有返回值
1 //eval() 方法用来解析字符串,只是接受一个参数,这个参数中就是要执行的JS代码,在AJAX中用来传递参数很频繁使用 2 var box=‘alert("wo shi zai zi fu chuan zhong di JS dai ma !!!")‘; 3 alert(box); // alert("wo shi zai zi fu chuan zhong di JS dai ma !!!") 4 eval(box); // wo shi zai zi fu chuan zhong di JS dai ma !!! 5 6 var box=‘alert("abc")‘; //注意要写正确这里面的JS代码 7 alert(box); //alert("abc") 8 alert(eval(box)); //先输出:abc 这是eval解析字符串box的结果,然后输出 undefined 说明此时eval方法没有返回值 9 10 //下面方法说明,在eval方法解析某种字面量变量的时候,返回的就是这个字面量的值 11 var box="[3,4,5,6]"; 12 alert(box); // [3,4,5,6] 13 var res=eval(box); 14 alert(res); // 3,4,5,6 eval() 方法将解析的结果返回,是一个数组 15 16 var box=‘"234"‘; 17 alert(typeof eval(box)); //string 18 alert(eval(box)); //234
如果字符串中定义有函数,或者变量等,和正则表达式中的一些属性一样,需要先执行以下,也就是说先解析一下(eval(box));然后后面的语句中就可以调用这个字符串中定义的方法了
1 //如果字符串中含有方法或者变量的时候,是需要先解析一次字符串,然后就可以调用和执行字符串中的方法, 2 var box=‘var run=123;function sum(){return 123;}‘; 3 //alert(sum()); // error: not undefiend 4 //alert(run); // error: not undefined 5 eval(box); //解析一次,就将box中最原始的JS代码进行了还原, 6 alert(sum()); // 123 上面通过eval方法解析了字符串 box 知道定义了一个方法名为sum 7 alert(run); //123
eval() 方法虽然很好用,功能很强大,但是也是很危险的方法,因此在使用的时候应该谨慎使用。特别是在用户输入数据的时候,很可能会导致程序的安全性问题,比如代码注入等等
5、Global 内置的一些属性
有很多属性,比如 undefined,Array,NaN,Object,Function 等,alert(Array);返回的就是数组类型Array的构造函数,也就是调用Array.constructor 时候的返回值
6、Math对象
Math对象是ECMAScript为了保存数学公式和信息而提供的一个对象,这个对象中的属性和方法的执行效率要比我们直接在JS中编写数学公式的效率高很多
7、Math对象的属性
Math对象的属性都是在平时的计算中很多时候都会用到的一些特殊的值,注意大小写
|
|
1 //Math 对象的属性 注意都是大写 下面这些属性都是Math对象内置的属性 2 alert(Math.E); // 自然数e:2.718281828459045 3 alert(Math.PI); // 圆周率π:3.141592653589793 4 alert(Math.LN10); // 10 的自然对数:2.302585092994046 5 alert(Math.LN2); // 2 的自然对数:0.6931471805599453 6 alert(Math.LOG2E); // 以2为底,e 的对数:1.4426950408889633 7 alert(Math.LOG10E); // 以 10 为底,e 的对数:0.4342944819032518 8 alert(Math.SQRT2); // 2 的开平方根:1.4142135623730951 9 alert(Math.SQRT1_2); // 1/2 的开平方根:0.7071067811865476 10 11 //证明了上面这都是内置的一些属性 12 alert(Math.LN20); //undefined 13 alert(Math.LOG5E); //undefined 14 alert(Math.SQRT1_4);//undefined 15 alert(Math.SQRT9); //undefined
8、min()、max() 方法
返回的是一组数中的最大值和最小值,前提是这一组数中必须全部能够成功的通过隐试转换成数值,也就是说可以包含数值型字符串,但是不能够包含非数值型字符串,否则会返回NaN。
不能够传递一个数组进去,返回的也是NaN,只能这样使用 Math.min(2,3,4,5,‘7‘,1);
1 // min() max() 用来求一组数中的最大值和最小值 2 alert(Math.min(3,5,6,7,8,9)); //3 3 alert(Math.max(3,5,6,7,8,9)); //9 4 5 //数值行字符串自动转换 6 alert(Math.min(‘3‘,4,9,10,‘5‘,‘6‘)); //3 7 alert(Math.max(‘3‘,4,9,‘10‘,5,‘6‘)); //10 8 9 //如果不能够转换其中的任何一个数字,返回的是NaN;转换的时候应该是调用的Number(x)方法进行转换的 10 alert(Math.min(‘abc‘,4,9,10,‘5‘,‘6‘)); //NaN 11 alert(Math.max(‘abc‘,4,9,‘10‘,5,‘6‘)); //NaN 12 alert(Math.max(3,4,9,10,5,‘6abc‘)); //NaN 13 14 //不支持传递一个数组进去 15 var box=[2,3,4,5,6,7,8]; 16 alert(Math.min(box)); //NaN 17 alert(Math.max(box)); //NaN 18 //alert(box.min()); //不提供此方法 19 alert(box.min); //undefined
9、舍入方法
Math.ceil(num):将num向上舍入到里这个数最近的一个整数。Math.ceil(5.1)==6为true
Math.floor(num):将num向下舍去,即它总是将数值向下舍入为最接近的整数;取整
Math.round(num):四舍五入方法,
这些方法同样能够接收数值型的字符串(‘5‘),因为内部会隐试的调用Number()转换方法,只是处理传入进去的第一个参数,其余的参数会被忽略掉
1 // 舍入方法 ceil() floor() round() 只是接受一个参数,多余的会忽略掉 2 //ceil() 方法 就是向上舍入,将小数点后面的数值向上舍入为最近的整数 3 alert(Math.ceil(5.9)); //6 4 alert(Math.ceil(5.5)); //6 5 alert(Math.ceil(5.1)); //6 6 alert(Math.ceil(‘5.1‘)); //6 自动调用内置的转换方法Number()方法 7 alert(Math.ceil(‘5.1a‘)); //NaN 8 9 //floor() 方法,就是向下舍去,将小数点后面的数值向下舍为最近的整数 10 alert(Math.floor(5.9)); //5 11 alert(Math.floor(5.5)); //5 12 alert(Math.floor(5.1)); //5 13 alert(Math.floor(‘5.1‘)); //5 自动调用内置的转换方法 Number()方法 14 alert(Math.floor(‘5.1a‘)); //NaN 15 16 // round() 方法,对参数进行四舍五入 17 alert(Math.round(5.9)); //6 18 alert(Math.round(5.5)); //6 19 alert(Math.round(5.1)); //5 20 alert(Math.round(‘5.1‘)); //5 21 alert(Math.round(‘5.1a‘)); //NaN 22 23 alert(Math.round(5.4,6.7)); //5
10、random 方法
这个方法是产生一个0到1之间的随机数,但是不包括0和1,Math.random() 即可
但是很多时候需要返回的是一个自定义的范围的随机数,可以采用一个公式:Math.floor(Math.random()*总数+起始数)。这个总数,并不是范围的结束数,而是通过计算而得:总数=结束数-起始数+1。由于随机数返回的是一个浮点数,故还要通过向下取整来进行舍入
可以通过函数的方法可以进行一个封装,传递两个参数,起始数和结尾数,返回一个符合此范围的随机数:
1 // 随机数 random 方法 用来返回的是0到1之间的一个随机数 2 var box=Math.random(); // 产生一个0到1之间的随机数 3 alert(box); 4 5 //产生10个0到1之间的随机数,并且输出到界面上 6 for(var i=0;i<10;i++){ 7 document.write(Math.random()); 8 document.write(‘<br />‘); 9 } 10 11 //产生的是9到14之间的随机数 本来是想产生5~10之间的整数 12 for(var i=0;i<10;i++){ 13 document.write(Math.random()*10+5); 14 document.write("<br />"); 15 } 16 17 //为了解决上面的问题,可以采用公式:Math.random()*总数+起始数; 其中 总数=结束数-起始数+1;原因不解释 18 //接收两个参数,返回在这两个参数之间的随机整数。 19 function ran(start,end){ 20 var count=end-start+1; 21 return Math.floor(Math.random()*count+start);//产生一个符合区间的随机数,然后向下取整, 22 } 23 24 for(var i=0;i<10;i++){ 25 document.write(ran(5,10)); //产生5~10之间的一个随机数 26 document.write("<br />"); 27 }
11、其它的数学方法
|
求正切的时候结果不是很精确:alert(Math.tan(Math.PI/4)); //0.99999999999
1 //其他的一些方法 2 alert(Math.abs(-3)); //3 取绝对值方法 3 alert(Math.exp(3)); //20.085536923187668 自然数 e 的3次方,传递的参数可变的 4 5 alert(Math.LN10); //属性,返回10的自然对数 6 //返回一个数的自然对数,就是以 e 为底的自然对数 7 alert(Math.log(10)); 8 alert(Math.log(100)); 9 alert(Math.log(9)); 10 11 // Math.pow(num,power) 返回的是num数据的power次幂 12 alert(Math.pow(2,3)); //8 13 alert(Math.pow(4,2)); //16 14 15 // Math.sqrt(num) 返回数据 num 的平方根 16 //这两个是属性中的开平方根 17 alert(Math.SQRT2); 18 alert(Math.SQRT1_2); 19 //下面才是方法的使用 20 alert(Math.sqrt(9)); //3 21 alert(Math.sqrt(100)); //10 22 23 // 三角函数 是以弧度为单位 24 alert(Math.sin(90)); //0.8939966636005578 25 alert(Math.sin(Math.PI/2)); //1 26 alert(Math.cos(Math.PI/4)); //余弦 27 alert(Math.tan(Math.PI/4)); //0.99999999999 正切 28 29 //求反正切 Math.atan(x); 返回的也是弧度值 30 alert(Math.atan(1)); //0.7853981633974483 31 alert(Math.PI/4); //0.7853981633974483 32 //Math.atan2(x,y);返回的是x/y的反正切值 33 alert(Math.atan2(4,2)); //1.1071487177940904 34 alert(Math.atan(2)); //1.1071487177940904 35 36 //反余弦与反正弦 37 alert(Math.asin(1)); //1.5707963267948965 38 alert(Math.PI/2); //1.5707963267948965 39 alert(Math.acos(1)); //0 40 alert(Math.acos(-1)); //3.141592653589793 41 alert(Math.PI); //3.141592653589793
以上是关于JavaScript中本地对象内置对象和宿主对象的主要内容,如果未能解决你的问题,请参考以下文章