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
View Code

 如果字符串中定义有函数,或者变量等,和正则表达式中的一些属性一样,需要先执行以下,也就是说先解析一下(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
View Code

eval() 方法虽然很好用,功能很强大,但是也是很危险的方法,因此在使用的时候应该谨慎使用。特别是在用户输入数据的时候,很可能会导致程序的安全性问题,比如代码注入等等

5、Global 内置的一些属性    

  有很多属性,比如 undefined,Array,NaN,Object,Function 等,alert(Array);返回的就是数组类型Array的构造函数,也就是调用Array.constructor 时候的返回值

6Math对象    

  Math对象是ECMAScript为了保存数学公式和信息而提供的一个对象,这个对象中的属性和方法的执行效率要比我们直接在JS中编写数学公式的效率高很多

7、Math对象的属性    

  Math对象的属性都是在平时的计算中很多时候都会用到的一些特殊的值,注意大小写 

属性说明
Math.E返回的是自然数e的值
Math.PI返回的是圆周率π的值
Math.LN2返回的是以自然数e为底,2的自然对数
Math.LN10返回的是以自然数e为底,10的自然对数
Math.LOG2E返回以2为底,自然数e的对数
Math.LOG10E返回的是以10为底,自然数e的对数
Math.SQRT2返回的是2的开平方根
Math.SQRT1_2返回的是1/2的平方根

 

 

 

 

 

 

 

 

 

 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
View Code

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
View Code

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
View Code

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     }
View Code

11、其它的数学方法  

方法说明
Math.abs(num)返回数据 num 的绝对值
Math.exp(num)返回自然数 e 的 num 次方
Math.log(num)返回 num 关于自然数 e 的对数
Math.pow(num,power)返回数据 num 的 power 次方
Math.sqrt(num)返会 num 的开平方根
Math.sin(x)返回 x 的正弦值,x 是弧度单位
Math.cos(x)返回 x 的余弦值,x 是弧度单位
Math.tan(x)返回 x 的正切值,x 是弧度单位
Math.asin(x)返回 x 的反正弦值,返回的单位是弧度
Math.acos(x)返回 x 的反余弦值,返回的单位是弧度
Math.atan(x)返回 x 的反正切值,返回的单位是弧度
Math.atan2(x,y)返回的是 x/y 的反正切值,弧度单位
 

 

  求正切的时候结果不是很精确: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
View Code

 

转载于:https://www.cnblogs.com/mengyu22/p/7478258.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467737.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

类的真正形态

类的真正形态 类的关键字 struct在C语言中已经有了自己的定义&#xff0c;必须继续兼容 在C中提供了新的关键字&#xff0c;class用于类定义 class和struct用法是完全相同 struct和class区别 用struct定义时&#xff0c;所有成员默认为public 用class定义时&#xff0c;所…

分类器

sklearn分类器性能指标 分类器性能评估指标 只限于二元单元标签分类问题 可用于二元多标签分类问题的评估指标 如何将二元分类指标扩展到多类或多标签问题中去 可用于多类分类问题的评估指标(紫色的可用于多标签问题&#xff09; accuracy_score准确率 函数计算分类…

Cucumber+Rest Assured快速搭建api自动化测试平台

转载&#xff1a;http://www.jianshu.com/p/6249f9a9e9c4 什么是Cucumber&#xff1f;什么是BDD&#xff1f;这里不细讲&#xff0c;不懂的直接查看官方&#xff1a;https://cucumber.io/  什么是Rest Assured&#xff1f;传送门&#xff1a;https://github.com/rest-assured…

让这个该死的服务跑起来了~

#前言被该死的Openssl编译嘲讽了一个下午之前的文章说了我的那个编译的问题&#xff0c;这里说下&#xff0c;知识点有点零散&#xff0c;最后的解决也是一个同事提示&#xff0c;感觉也有点奇葩的赶脚。到目前为止&#xff0c;我现在感受到了写文章的好处&#xff0c;昨晚的问…

深度学习概述

深度学习 传统学习与深度学习 深度学习应用特点 深度学习框架比较 Tensorflow 神经元 卷积核 分类 回归 生成

Python--递归

面向函数编程 def func():print(从前有座山&#xff0c;山里有座庙&#xff0c;庙里有个老和尚讲故事&#xff0c;讲的什么呀&#xff1f;)func() 解耦&#xff1a;尽量把不相关的功能拆开&#xff0c;用的时候再调用函数&#xff0c;增强代码重用性&#xff0c;减少代码变更的…

传统神经网络

文章目录神经网络的起源&#xff1a;线性回归一个线性回归问题线性回归优化方法&#xff1a;梯度下降梯度计算梯度计算总结线性回归&#xff1a;输出线性回归&#xff1a;局限从线性到非线性非线性激励常用的非线性激励函数tanhRELULecky RELU神经元—神经网络神经网络构建神经…

深度学习之卷积神经网络

文章目录深度学习之卷积神经网络链式反向梯度链式法则的计算神经网络中链式法则实例二、卷积神经网络-卷积层&#xff08;一&#xff09;什么是卷积层&#xff08;二&#xff09;有什么组成受什么影响&#xff0c;有何特点卷积网络正向传播反向传播卷积和神经网络功能层深度学习…

卷积神经网络高级篇

【 文章目录Alextnet参数计算VGG alexnet增强版VGG参数计算VGG作用GoogleNet 多分辨率融合全卷积神经网络RESNET结构特性有效性结构化图片特殊处理识别效果全局部卷积网络缺陷U-net图片生成网络VGG u-netAlextnet 参数计算 VGG alexnet增强版 VGG参数计算 VGG作用 GoogleNet 多…

LinuxGPIO操作和MTK平台GPIO

GPIO口配置是一个历史性的问题&#xff0c;不管我们使用什么MCU&#xff0c;单片机也好&#xff0c;ARM也好&#xff0c;都离不开驱动GPIO口。Linux下有一个宏&#xff0c;GPIO_GPIO_SYSFS&#xff0c;打开这个宏后&#xff0c;编译烧录到设备端&#xff0c;去看看sys/class/gp…

Linux cpu亲和力

最近在对项目进行性能优化&#xff0c;由于在多核平台上&#xff0c;所以了解了些进程、线程绑定cpu核的问题&#xff0c;在这里将所学记录一下。不管是线程还是进程&#xff0c;都是通过设置亲和性(affinity)来达到目的。对于[进程]的情况&#xff0c;一般是使用sched_setaffi…

卷积神经网络(目标分类)

文章目录目标分类基本框架数据准备数据扩充数据规范模型设计任务分类局部更改训练细节目标分类基本框架 数据准备 现有数据集的子集&#xff0c;网络采集&#xff0c;现有数据人工标注 数据扩充 原始数据切割&#xff0c;噪声颜色等像素变化&#xff0c;旋转平移 数据规范…

安卓9.0添加服务修改SELinux

#文章目录#前言#SELinux来源#SELinux基本框架#SELinux 在不同版本的表现#使用audit2allow工具生成SELinux 权限#完整代码#前言先推荐下之前的SELinux文章&#xff0c;但是那个是7.1的&#xff0c;在9.0上已经在差别很大的了。Android7.1 在init.rc 添加shell服务题外话~在企业里…

卷积神经网络-目标探测

文章目录目标探测介绍任务思路DPMRCNN1&#xff09;候选区域选择2&#xff09;CNN特征提取3&#xff09;分类与边界回归R-CNN总结优点缺陷FAST-RCNNFASTER-RCNNYOLO目标探测介绍 任务 分类获取坐标 目标探测 图片分割 思路 回归问题&#xff1a;利用神经网络进行目标识别&am…

相机视场角和焦距_镜头小讲堂(一)镜头的焦距

在刚购买完相机的时候&#xff0c;我们久会考虑需要什么样的镜头来配合机身来使用。而市场上的镜头种类是在太多了&#xff0c;所以我们就要学习了解下镜头都有哪些种类&#xff0c;选择哪种镜头比较有优势。这也是学习摄影必备的基础知识。01 镜头的焦距焦距是镜头的重要指标&…

C语言指定初始化器解析及其应用

由于笔者能力有限&#xff0c;文中如果出现错误的地方&#xff0c;欢迎大家给我指出来&#xff0c;我将不胜感激&#xff0c;谢谢&#xff5e;#指定初始化器的概念C90 标准要求初始化程序中的元素以固定的顺序出现&#xff0c;与要初始化的数组或结构体中的元素顺序相同。但是在…

递归神经网络

文章目录LSTM![在这里插入图片描述](https://img-blog.csdnimg.cn/20200609171449198.pngLSTM 4INPUTS 1outputs

CNN+RNN

文章目录相同点不同点组合意义组合方式图片标注基本思路模型设计&#xff0d;数据准备视频行为识别视频行为识别图片问答相同点 传统神经网络的扩展 前向计算产生结果&#xff0c;反向计算模型更新 每层神经网络横向可以多个神经元共存&#xff0c;纵向可以多层神经网络链接 …

深入理解Linux内核链表

之前写过的链表文章&#xff0c;再结合这篇&#xff0c;我觉得是一道硬菜。Linux内核链表C语言&#xff0c;链表大家五一节日快乐&#xff0c;我知道劳动节大家都辛苦了&#xff0c;吃点硬菜好顶住饿肚子~#一、 链表数据结构简介链表是一种常用的组织有序数据的数据结构&#x…

GAN

文章目录生成对抗网络(GAN)基础生成对抗网络 优点&#xff1a;缺点&#xff1a;生成对抗网络深度GANDCGAN结构细节特征研究DCGAN总结条件GAN模型结构INFOGANInfoGAN: 自动学习z中部分变量意义Wasserstein GANGAN存在问题原因WGAN特点改进方法&#xff1a;生成对抗网络(GAN)基础…