一、AJAX里面status的值表明什么 二、get post 的区别 三、怎样把对象转化成字符串 四、闭包、继承、原型、原型链 5 、http传输协议 六、arguments是什么

一、AJAX里面status的值表明什么    javascript

在JavaScript里面写AJax的时,最关键的一步是对XMLHttpRequest对象创建监听,即便用“onreadystatechange”方法。监听的时候,要对XMLHttpRequest对象的请求状态进行判断,一般是判断readyState的值为4且status的值为200或者304时执行咱们须要的操做。如下记录了一些经常使用readState以及status的值及其含义html

 

readyState 属性表示Ajax请求的当前状态。它的值用数字表明。
0 表明未初始化。 尚未调用 open 方法
1 表明正在加载。 open 方法已被调用,但 send 方法尚未被调用
2 表明已加载完毕。send 已被调用。请求已经开始
3 表明交互中。服务器正在发送响应
4 表明完成。响应发送完毕java

 

经常使用状态码(status)及其含义:数据库

 

404 没找到页面(not found)
403 禁止访问(forbidden)
500 内部服务器出错(internal service error)
200 一切正常(ok)
304 没有被修改(not modified)(服务器返回304状态,表示源文件没有被修改 )浏览器

二、get post 的区别    缓存

Http定义了与服务器交互的不一样方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,咱们能够这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操做。到这里,你们应该有个大概的了解了,GET通常用于获取/查询资源信息,而POST通常用于更新资源信息。安全

  1.根据HTTP规范,GET用于信息获取,并且应该是安全的和幂等的。服务器

  (1).所谓安全的意味着该操做用于获取信息而非修改信息。换句话说,GET 请求通常不该产生反作用。就是说,它仅仅是获取资源信息,就像数据库查询同样,不会修改,增长数据,不会影响资源的状态。网络

  * 注意:这里安全的含义仅仅是指是非修改信息。闭包

  (2).幂等的意味着对同一URL的多个请求应该返回一样的结果。这里我再解释一下幂等这个概念:

复制代码
   幂等(idempotent、idempotence)是一个数学或计算机学概念,常见于抽象代数中。
  幂等有一下几种定义:
  对于单目运算,若是一个运算对于在范围内的全部的一个数屡次进行该运算所得的结果和进行一次该运算所得的结果是同样的,那么咱们就称该运算是幂等的。好比绝对值运算就是一个例子,在实数集中,有abs(a)=abs(abs(a))。
  对于双目运算,则要求当参与运算的两个值是等值的状况下,若是知足运算结果与参与运算的两个值相等,则称该运算幂等,如求两个数的最大值的函数,有在在实数集中幂等,即max(x,x) = x。
复制代码

看完上述解释后,应该能够理解GET幂等的含义了。

  但在实际应用中,以上2条规定并无这么严格。引用别人文章的例子:好比,新闻站点的头版不断更新。虽然第二次请求会返回不一样的一批新闻,该操做仍然被认为是安全的和幂等的,由于它老是返回当前的新闻。从根本上说,若是目标是当用户打开一个连接时,他能够确信从自身的角度来看没有改变资源便可。

  2.根据HTTP规范,POST表示可能修改变服务器上的资源的请求。继续引用上面的例子:仍是新闻以网站为例,读者对新闻发表本身的评论应该经过POST实现,由于在评论提交后站点的资源已经不一样了,或者说资源被修改了。

 

  上面大概说了一下HTTP规范中GET和POST的一些原理性的问题。但在实际的作的时候,不少人却没有按照HTTP规范去作,致使这个问题的缘由有不少,好比说:

  1.不少人贪方便,更新资源时用了GET,由于用POST必需要到FORM(表单),这样会麻烦一点。

  2.对资源的增,删,改,查操做,其实均可以经过GET/POST完成,不须要用到PUT和DELETE。

  3.另一个是,早期的Web MVC框架设计者们并无有意识地将URL看成抽象的资源来看待和设计,因此致使一个比较严重的问题是传统的Web MVC框架基本上都只支持GET和POST两种HTTP方法,而不支持PUT和DELETE方法。

   * 简单解释一下MVC:MVC原本是存在于Desktop程序中的,M是指数据模型,V是指用户界面,C则是控制器。使用MVC的目的是将M和V的实现代码分离,从而使同一个程序能够使用不一样的表现形式。

  以上3点典型地描述了老一套的风格(没有严格遵照HTTP规范),随着架构的发展,如今出现REST(Representational State Transfer),一套支持HTTP规范的新风格,这里很少说了,能够参考《RESTful Web Services》。

 

  说完原理性的问题,咱们再从表面现像上面看看GET和POST的区别:

  1.GET请求的数据会附在URL以后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,参数之间以&相连,如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0%E5%A5%BD。若是数据是英文字母/数字,原样发送,若是是空格,转换为+,若是是中文/其余字符,则直接把字符串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。

  POST把提交的数据则放置在是HTTP包的包体中。

  2."GET方式提交的数据最多只能是1024字节,理论上POST没有限制,可传较大量的数据,IIS4中最大为80KB,IIS5中为100KB"??!

  以上这句是我从其余文章转过来的,其实这样说是错误的,不许确的:

  (1).首先是"GET方式提交的数据最多只能是1024字节",由于GET是经过URL提交数据,那么GET可提交的数据量就跟URL的长度有直接关系了。而实际上,URL不存在参数上限的问题,HTTP协议规范没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制。IE对URL长度的限制是2083字节(2K+35)。对于其余浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操做系统的支持。

  注意这是限制是整个URL长度,而不只仅是你的参数值数据长度。[见参考资料5]

  (2).理论上讲,POST是没有大小限制的,HTTP协议规范也没有进行大小限制,说“POST数据量存在80K/100K的大小限制”是不许确的,POST数据是没有限制的,起限制做用的是服务器的处理程序的处理能力。

  对于ASP程序,Request对象处理每一个表单域时存在100K的数据长度限制。但若是使用Request.BinaryRead则没有这个限制。

  由这个延伸出去,对于IIS 6.0,微软出于安全考虑,加大了限制。咱们还须要注意:

     1).IIS 6.0默认ASP POST数据量最大为200KB,每一个表单域限制是100KB。
     2).IIS 6.0默认上传文件的最大大小是4MB。
     3).IIS 6.0默认最大请求头是16KB。
  IIS 6.0以前没有这些限制。[见参考资料5]

  因此上面的80K,100K可能只是默认值而已(注:关于IIS4和IIS5的参数,我尚未确认),但确定是能够本身设置的。因为每一个版本的IIS对这些参数的默认值都不同,具体请参考相关的IIS配置文档。

  3.在ASP中,服务端获取GET请求参数用Request.QueryString,获取POST请求参数用Request.Form。在JSP中,用request.getParameter(\"XXXX\")来获取,虽然jsp中也有request.getQueryString()方法,但使用起来比较麻烦,好比:传一个test.jsp?name=hyddd&password=hyddd,用request.getQueryString()获得的是:name=hyddd&password=hyddd。在PHP中,能够用$_GET和$_POST分别获取GET和POST中的数据,而$_REQUEST则能够获取GET和POST两种请求中的数据。值得注意的是,JSP中使用request和PHP中使用$_REQUEST都会有隐患,这个下次再写个文章总结。

  4.POST的安全性要比GET的安全性高。注意:这里所说的安全性和上面GET提到的“安全”不是同个概念。上面“安全”的含义仅仅是不做数据修改,而这里安全的含义是真正的Security的含义,好比:经过GET提交数据,用户名和密码将明文出如今URL上,由于(1)登陆页面有可能被浏览器缓存,(2)其余人查看浏览器的历史纪录,那么别人就能够拿到你的帐号和密码了,除此以外,使用GET提交数据还可能会形成Cross-site request forgery攻击。

  总结一下,Get是向服务器发索取数据的一种请求,而Post是向服务器提交数据的一种请求,在FORM(表单)中,Method默认为"GET",实质上,GET和POST只是发送机制不一样,并非一个取一个发!

三、怎样把对象转化成字符串    

1、采用Object.toString()
toString方法是java.lang.Object对象的一个public方法。在java中任何对象都会继承Object对象,因此通常来讲任何对象均可以调用toString这个方法。这是采用该种方法时,常派生类会覆盖Object里的toString()方法。
可是在使用该方法时要注意,必须保证Object不是null值,不然将抛出NullPointerException异常。

2、采用(String)Object
 该方法是一个标准的类型转换的方法,能够将Object转换为String。可是在使用该方法是要注意的是须要转换的类型必须是可以转换为String的,不然会出现CalssCastException异常错误。

Object o = new Integer(100);
String string = (String)o;

 

这段程序代码会出现java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String。由于将Integer类型强制转换为String类型,没法经过。

3、String.valueOf(Object)
上面咱们使用Object.toString()方法时须要担忧null问题。可是使用该方法无需担忧null值问题。由于在使用String.valueOf(Object)时,它会判断Object是否为空值,若是是,则返回null。下面为String.valueOf(Object)的源码:

public static String valueOf(Object obj) {
     return (obj == null) ? "null" : obj.toString();

}

 

从上面咱们能够看出两点:一是不须要担忧null问题。二是它是以toString()方法为基础的。
可是必定要注意:当object为null时,String.valueOf(object)的值是字符串对象:"null",而不是null

 

四、闭包、继承、原型、原型链  

 

1、原型、原型链

原型对象
   在JavaScript 中,每当定义一个对象(函数)时候,对象中都会包含一些预约义的属性。其中函数对象的一个属性就是原型对象 prototype。注:普通对象没有prototype,但有__proto__属性。

  原型对象其实就是普通对象(Function.prototype除外,它是函数对象,但它很特殊,他没有prototype属性(前面说道函数对象都有prototype属性))。看下面的例子:
 function f1(){};
 console.log(f1.prototype) //f1{}
 console.log(typeof f1. prototype) //Object
 console.log(typeof Function.prototype) // Function,这个特殊
 console.log(typeof Object.prototype) // Object
 console.log(typeof Function.prototype.prototype) //undefined

 从这句console.log(f1.prototype) //f1 {} 的输出就结果能够看出,f1.prototype就是f1的一个实例对象。就是在f1建立的时候,建立了一个它的实例对象并赋值给它的prototype,基本过程以下:
 var temp = new f1();
 f1. prototype = temp;

  因此,Function.prototype为何是函数对象就迎刃而解了,上文提到凡是new Function ()产生的对象都是函数对象,因此temp1是函数对象。
 var temp1 = new Function ();
 Function.prototype = temp1;

那原型对象是用来作什么的呢?主要做用是用于继承。举了例子:
  var person = function(name){
   this.name = name
  };
  person.prototype.getName = function(){
     return this.name; 
  }
  var zjh = new person(‘zhangjiahao’);
  zjh.getName(); //zhangjiahao

   从这个例子能够看出,经过给person.prototype设置了一个函数对象的属性,那有person实例(例中:zjh)出来的普通对象就继承了这个属性。具体是怎么实现的继承,就要讲到下面的原型链了。

三.原型链
   JS在建立对象(不管是普通对象仍是函数对象)的时候,都有一个叫作__proto__的内置属性,用于指向建立它的函数对象的原型对象prototype。以上面的例子为例:

  console.log(zjh.__proto__ === person.prototype) //true

一样,person.prototype对象也有__proto__属性,它指向建立它的函数对象(Object)的prototype

  console.log(person.prototype.__proto__ === Object.prototype) //true

继续,Object.prototype对象也有__proto__属性,但它比较特殊,为null

  console.log(Object.prototype.__proto__) //null

咱们把这个有__proto__串起来的直到Object.prototype.__proto__为null的链叫作原型链。以下图:

四.内存结构图
为了更加深刻和直观的进行理解,下面咱们画一下上面的内存结构图:


画图约定:


疑点解释:
1.Object.__proto__ === Function.prototype // true
  Object是函数对象,是经过new Function()建立,因此Object.__proto__指向Function.prototype。

2.Function.__proto__ === Function.prototype // true
  Function 也是对象函数,也是经过new Function()建立,因此Function.__proto__指向Function.prototype。

本身是由本身建立的,好像不符合逻辑,但仔细想一想,现实世界也有些相似,你是怎么来的,你妈生的,你妈怎么来的,你姥姥生的,……类人猿进化来的,那类人猿从哪来,一直追溯下去……,就是无,(NULL生万物)
正如《道德经》里所说“无,名天地之始”。

3.Function.prototype.__proto__ === Object.prototype //true
其实这一点我也有点困惑,不过也能够试着解释一下。
Function.prototype是个函数对象,理论上他的__proto__应该指向 Function.prototype,就是他本身,本身指向本身,没有意义。
JS一直强调万物皆对象,函数对象也是对象,给他认个祖宗,指向Object.prototype。Object.prototype.__proto__ === null,保证原型链可以正常结束。

五.constructor
  原型对象prototype中都有个预约义的constructor属性,用来引用它的函数对象。这是一种循环引用
  person.prototype.constructor === person //true
  Function.prototype.constructor === Function //true
  Object.prototype.constructor === Object //true

完善下上面的内存结构图:


有两点须要注意:
(1)注意Object.constructor===Function;//true 自己Object就是Function函数构造出来的 
(2)如何查找一个对象的constructor,就是在该对象的原型链上寻找碰到的第一个constructor属性所指向的对象

六.总结
1.原型和原型链是JS实现继承的一种模型。
2.原型链的造成是真正是靠__proto__ 而非prototype

2、闭包

1、什么是闭包?

官方”的解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(一般是一个函数),于是这些变量也是该表达式的一部分。
相信不多有人能直接看懂这句话,由于他描述的太学术。其实这句话通俗的来讲就是:JavaScript中全部的function都是一个闭包。不过通常来讲,嵌套的function所产生的闭包更为强大,也是大部分时候咱们所谓的“闭包”。看下面这段代码:

function a() { 
var i = 0;
function b() { alert(++i); }
return b;
}
var c = a();
c();

这段代码有两个特色:

一、函数b嵌套在函数a内部;

二、函数a返回函数b。

引用关系如图:

  这样在执行完var c=a()后,变量c其实是指向了函数b,再执行c()后就会弹出一个窗口显示i的值(第一次为1)。这段代码其实就建立了一个闭包,为何?由于函数a外的变量c引用了函数a内的函数b,就是说:

  当函数a的内部函数b被函数a外的一个变量引用的时候,就建立了一个闭包。

  让咱们说的更透彻一些。所谓“闭包”,就是在构造函数体内定义另外的函数做为目标对象的方法函数,而这个对象的方法函数反过来引用外层函数体中的临时变量。这使得只要目标 对象在生存期内始终能保持其方法,就能间接保持原构造函数体当时用到的临时变量值。尽管最开始的构造函数调用已经结束,临时变量的名称也都消失了,但在目 标对象的方法内却始终能引用到该变量的值,并且该值只能通这种方法来访问。即便再次调用相同的构造函数,但只会生成新对象和方法,新的临时变量只是对应新 的值,和上次那次调用的是各自独立的。

2、闭包有什么做用?

  简而言之,闭包的做用就是在a执行完并返回后,闭包使得Javascript的垃圾回收机制GC不会收回a所占用的资源,由于a的内部函数b的执行须要依赖a中的变量。这是对闭包做用的很是直白的描述,不专业也不严谨,但大概意思就是这样,理解闭包须要按部就班的过程。

在上面的例子中,因为闭包的存在使得函数a返回后,a中的i始终存在,这样每次执行c(),i都是自加1后alert出i的值。

  那 么咱们来想象另外一种状况,若是a返回的不是函数b,状况就彻底不一样了。由于a执行完后,b没有被返回给a的外界,只是被a所引用,而此时a也只会被b引 用,所以函数a和b互相引用但又不被外界打扰(被外界引用),函数a和b就会被GC回收。(关于Javascript的垃圾回收机制将在后面详细介绍)

3、闭包内的微观世界

  若是要更加深刻的了解闭包以及函数a和嵌套函数b的关系,咱们须要引入另外几个概念:函数的执行环境(excution context)、活动对象(call object)、做用域(scope)、做用域链(scope chain)。以函数a从定义到执行的过程为例阐述这几个概念。

  1. 定义函数a的时候,js解释器会将函数a的做用域链(scope chain)设置为定义a时a所在的“环境”,若是a是一个全局函数,则scope chain中只有window对象。
  2. 执行函数a的时候,a会进入相应的执行环境(excution context)
  3. 在建立执行环境的过程当中,首先会为a添加一个scope属性,即a的做用域,其值就为第1步中的scope chain。即a.scope=a的做用域链。
  4. 而后执行环境会建立一个活动对象(call object)。活动对象也是一个拥有属性的对象,但它不具备原型并且不能经过JavaScript代码直接访问。建立完活动对象后,把活动对象添加到a的做用域链的最顶端。此时a的做用域链包含了两个对象:a的活动对象和window对象。
  5. 下一步是在活动对象上添加一个arguments属性,它保存着调用函数a时所传递的参数。
  6. 最后把全部函数a的形参和内部的函数b的引用也添加到a的活动对象上。在这一步中,完成了函数b的的定义,所以如同第3步,函数b的做用域链被设置为b所被定义的环境,即a的做用域。

到此,整个函数a从定义到执行的步骤就完成了。此时a返回函数b的引用给c,又函数b的做用域链包含了对函数a的活动对象的引用,也就是说b能够访问到a中定义的全部变量和函数。函数b被c引用,函数b又依赖函数a,所以函数a在返回后不会被GC回收。

当函数b执行的时候亦会像以上步骤同样。所以,执行时b的做用域链包含了3个对象:b的活动对象、a的活动对象和window对象,以下图所示:

如图所示,当在函数b中访问一个变量的时候,搜索顺序是:

  1. 先搜索自身的活动对象,若是存在则返回,若是不存在将继续搜索函数a的活动对象,依次查找,直到找到为止。
  2. 若是函数b存在prototype原型对象,则在查找完自身的活动对象后先查找自身的原型对象,再继续查找。这就是Javascript中的变量查找机制。
  3. 若是整个做用域链上都没法找到,则返回undefined。

小结,本段中提到了两个重要的词语:函数的定义执行。文中提到函数的做用域是在定义函数时候就已经肯定,而不是在执行的时候肯定(参看步骤1和3)。用一段代码来讲明这个问题:

function f(x) { 
var g = function () { return x; }
return g;
}
var h = f(1);
alert(h()); 

这段代码中变量h指向了f中的那个匿名函数(由g返回)。

  • 假设函数h的做用域是在执行alert(h())肯定的,那么此时h的做用域链是:h的活动对象->alert的活动对象->window对象。
  • 假设函数h的做用域是在定义时肯定的,就是说h指向的那个匿名函数在定义的时候就已经肯定了做用域。那么在执行的时候,h的做用域链为:h的活动对象->f的活动对象->window对象。

若是第一种假设成立,那输出值就是undefined;若是第二种假设成立,输出值则为1。

运行结果证实了第2个假设是正确的,说明函数的做用域确实是在定义这个函数的时候就已经肯定了。

4、闭包的应用场景
保护函数内的变量安全。以最开始的例子为例,函数a中i只有函数b才能访问,而没法经过其余途径访问到,所以保护了i的安全性。

  1. 在内存中维持一个变量。依然如前例,因为闭包,函数a中i的一直存在于内存中,所以每次执行c(),都会给i自加1。
  2. 经过保护变量的安全实现JS私有属性和私有方法(不能被外部访问)
    私有属性和方法在Constructor外是没法被访问的

    function Constructor(...) {  
      var that = this;  
      var membername = value; 
      function membername(...) {...}
    }

以上3点是闭包最基本的应用场景,不少经典案例都源于此。

3、继承

 

JS继承的实现方式

 

既然要实现继承,那么首先咱们得有一个父类,代码以下:

 

// 定义一个动物类
function Animal (name) {
  // 属性
  this.name = name || 'Animal';
  // 实例方法
  this.sleep = function(){
    console.log(this.name + '正在睡觉!');
  }
}
// 原型方法
Animal.prototype.eat = function(food) {
  console.log(this.name + '正在吃:' + food);
};

 

一、原型链继承

 

核心: 将父类的实例做为子类的原型

 

function Cat(){ 
}
Cat.prototype = new Animal();
Cat.prototype.name = 'cat';

// Test Code
var cat = new Cat();
console.log(cat.name);
console.log(cat.eat('fish'));
console.log(cat.sleep());
console.log(cat instanceof Animal); //true 
console.log(cat instanceof Cat); //true

 

特色:

 

  1. 很是纯粹的继承关系,实例是子类的实例,也是父类的实例
  2. 父类新增原型方法/原型属性,子类都能访问到
  3. 简单,易于实现

 

缺点:

 

  1. 要想为子类新增属性和方法,必需要在new Animal()这样的语句以后执行,不能放到构造器中
  2. 没法实现多继承
  3. 来自原型对象的引用属性是全部实例共享的(详细请看附录代码: 示例1)
  4. 建立子类实例时,没法向父类构造函数传参

 

二、构造继承

 

核心:使用父类的构造函数来加强子类实例,等因而复制父类的实例属性给子类(没用到原型)

 

function Cat(name){
  Animal.call(this);
  this.name = name || 'Tom';
}

// Test Code
var cat = new Cat();
console.log(cat.name);
console.log(cat.sleep());
console.log(cat instanceof Animal); // false
console.log(cat instanceof Cat); // true

 

特色:

 

  1. 解决了1中,子类实例共享父类引用属性的问题
  2. 建立子类实例时,能够向父类传递参数
  3. 能够实现多继承(call多个父类对象)

 

缺点:

 

  1. 实例并非父类的实例,只是子类的实例
  2. 只能继承父类的实例属性和方法,不能继承原型属性/方法
  3. 没法实现函数复用,每一个子类都有父类实例函数的副本,影响性能

 

三、实例继承

 

核心:为父类实例添加新特性,做为子类实例返回

 

function Cat(name){
  var instance = new Animal();
  instance.name = name || 'Tom';
  return instance;
}

// Test Code
var cat = new Cat();
console.log(cat.name);
console.log(cat.sleep());
console.log(cat instanceof Animal); // true
console.log(cat instanceof Cat); // false

 

特色:

 

  1. 不限制调用方式,无论是new 子类()仍是子类(),返回的对象具备相同的效果

 

缺点:

 

  1. 实例是父类的实例,不是子类的实例
  2. 不支持多继承

 

四、拷贝继承

 

function Cat(name){
  var animal = new Animal();
  for(var p in animal){
    Cat.prototype[p] = animal[p];
  }
  Cat.prototype.name = name || 'Tom';
}

// Test Code
var cat = new Cat();
console.log(cat.name);
console.log(cat.sleep());
console.log(cat instanceof Animal); // false
console.log(cat instanceof Cat); // true

 

特色:

 

  1. 支持多继承

 

缺点:

 

  1. 效率较低,内存占用高(由于要拷贝父类的属性)
  2. 没法获取父类不可枚举的方法(不可枚举方法,不能使用for in 访问到)

 

五、组合继承

 

核心:经过调用父类构造,继承父类的属性并保留传参的优势,而后经过将父类实例做为子类原型,实现函数复用

 

function Cat(name){
  Animal.call(this);
  this.name = name || 'Tom';
}
Cat.prototype = new Animal();

// Test Code
var cat = new Cat();
console.log(cat.name);
console.log(cat.sleep());
console.log(cat instanceof Animal); // true
console.log(cat instanceof Cat); // true

 

特色:

 

  1. 弥补了方式2的缺陷,能够继承实例属性/方法,也能够继承原型属性/方法
  2. 既是子类的实例,也是父类的实例
  3. 不存在引用属性共享问题
  4. 可传参
  5. 函数可复用

 

缺点:

 

  1. 调用了两次父类构造函数,生成了两份实例(子类实例将子类原型上的那份屏蔽了)

 

六、寄生组合继承

 

核心:经过寄生方式,砍掉父类的实例属性,这样,在调用两次父类的构造的时候,就不会初始化两次实例方法/属性,避免的组合继承的缺点

 

function Cat(name){
  Animal.call(this);
  this.name = name || 'Tom';
}
(function(){
  // 建立一个没有实例方法的类
  var Super = function(){};
  Super.prototype = Animal.prototype;
  //将实例做为子类的原型
  Cat.prototype = new Super();
})();

// Test Code
var cat = new Cat();
console.log(cat.name);
console.log(cat.sleep());
console.log(cat instanceof Animal); // true
console.log(cat instanceof Cat); //true

 

特色:

 

  1. 堪称完美

 

缺点:

 

  1. 实现较为复杂

 

5 、http传输协议    

 http

超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为普遍的一种网络协议。全部的WWW文件都必须遵照这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。1960年美国人Ted Nelson构思了一种经过计算机处理文本信息的方法,并称之为超文本(hypertext),这成为了HTTP超文本传输协议标准架构的发展根基。Ted Nelson组织协调万维网协会(World Wide Web Consortium)和互联网工程工做小组(Internet Engineering Task Force )共同合做研究,最终发布了一系列的RFC,其中著名的RFC 2616定义了HTTP 1.1

http技术架构

 

HTTP是一个客户端和服务器端请求和应答的标准(TCP)。客户端是终端用户,服务器端是网站。经过使用Web浏览器、网络爬虫或者其它的工具,客户端发起一个到服务器上指定端口(默认端口为80)的HTTP请求。(咱们称这个客户端)叫用户代理(user agent)。应答的服务器上存储着(一些)资源,好比HTML文件和图像。(咱们称)这个应答服务器为源服务器(origin server)。在用户代理和源服务器中间可能存在
http和其余几种网络协议
多个中间层,好比代理,网关,或者隧道(tunnels)。尽管TCP/IP协议是互联网上最流行的应用,HTTP协议并无规定必须使用它和(基于)它支持的层。 事实上,HTTP能够在任何其余互联网协议上,或者在其余网络上实现。HTTP只假定(其下层协议提供)可靠的传输,任何可以提供这种保证的协议均可以被其使用。

 

一般,由HTTP客户端发起一个请求,创建一个到服务器指定端口(默认是80端口)的TCP链接。HTTP服务器则在那个端口监听客户端发送过来的请求。一旦收到请求,服务器(向客户端)发回一个状态行,好比"HTTP/1.1 200 OK",和(响应的)消息,消息的消息体多是请求的文件、错误消息、或者其它一些信息。
HTTP协议的网页
HTTP使用TCP而不是UDP的缘由在于(打开)一个网页必须传送不少数据,而TCP协议提供传输控制,按顺序组织数据,和错误纠正。

 

经过HTTP或者HTTPS协议请求的资源由统一资源标示符(Uniform Resource Identifiers)(或者,更准确一些,URLs)来标识。

 

 

 

http协议功能

 

HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传输协议。它能够使浏览器更加高效,使网络传输减小。它不只保证计算机正确快速地传输超文本文档,还肯定传输文档中的哪一部分,以及哪部份内容首先显示(如文本先于图形)等。

 

HTTP是客户端浏览器或其余程序与Web服务器之间的应用层通讯协议。在Internet上的Web服务器上存放的都是超文本信息,客户机须要经过HTTP协议传输所要访问的超文本信息。HTTP包含命令和传输信息,不只可用于Web访问,也能够用于其余因特网/内联网应用系统之间的通讯,从而实现各种应用资源超媒体访问的集成。

 

咱们在浏览器的地址栏里输入的网站地址叫作URL (Uniform Resource Locator,统一资源定位符)。就像每家每户都有一个门牌地址同样,每一个网页也都有一个Internet地址。当你在
http功用
浏览器的地址框中输入一个URL或是单击一个超级连接时,URL就肯定了要浏览的地址。浏览器经过超文本传输协议(HTTP),将Web服务器上站点的网页代码提取出来,并翻译成漂亮的网页。

 

 

 

http协议基础

 

HTTP(HyperText Transport Protocol)是超文本传输协议的缩写,它用于传送WWW方式的数据,关于HTTP协议的详细内容请参考RFC2616。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求,请求头包含请求的方法、URL、协议版本、以及包含请求修饰符、客户信息和内容的相似于MIME的消息结构。服务器以一个状态行做为响应,响应的内容包括消息协议的版本,成功或者错误编码加上包含服务器信息、实体元信息以及可能的实体内容。

 

一般HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息。这两种类型的消息由一个起始行,一个或者多个头域,一个指示头域结束的空行和可选的消息体组成。HTTP的头域包括通用头,请求头,响应头和实体头四个部分。每一个头域由一个域名,冒号(:)和域值三部分组成。域名是大小写无关的,域值前能够添加任何数量的空格符,头域能够被扩展为多行,在每行开始处,使用至少一个空格或制表符。

 

 

 

http通用头域

 

通用头域包含请求和响应消息都支持的头域,通用头域包含Cache-Control、Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via。对通用头域的扩展要求通信双方都支持此扩展,若是存在不支持的通用头域,通常将会做为实体头域处理。下面简单介绍几个在UPnP消息中使用的通用头域:

 

1.Cache-Control头域

 

Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另外一个消息处理过程当中的缓存处理过程。请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached,响应消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age。各个消息中的指令含义以下:

 

Public指示响应可被任何缓存区缓存。

 

Private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这容许服务器仅仅描述当用户
http结构
的部分响应消息,此响应消息对于其余用户的请求无效。

 

no-cache指示请求或响应消息不能缓存

 

no-store用于防止重要的信息被无心的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。

 

max-age指示客户机能够接收生存期不大于指定时间(以秒为单位)的响应。

 

min-fresh指示客户机能够接收响应时间小于当前时间加上指定时间的响应。

 

max-stale指示客户机能够接收超出超时期间的响应消息。若是指定max-stale消息的值,那么客户机能够接收超出超时期指定值以内的响应消息。

 

HTTP Keep-Alive

 

Keep-Alive功能使客户端到服务器端的链接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了创建或者从新创建链接。市场上的大部分Web服务器,包括iPlanet、IIS和Apache,都支持HTTP Keep-Alive。对于提供静态内容的网站来讲,这个功能一般颇有用。可是,对于负担较重的网站来讲,这里存在另一个问题:虽然为客户保留打开的链接有必定的好处,但它一样影响了性能,由于在处理暂停期间,原本能够释放的资源仍旧被占用。当Web服务器和应用服务器在同一台机器上运行时,Keep- Alive功能对资源利用的影响尤为突出。

 

KeepAliveTime 值控制 TCP/IP 尝试验证空闲链接是否无缺的频率。若是这段时间内没有活动,则会发送保持活动信号。若是网络工做正常,并且接收方是活动的,它就会响应。若是须要对丢失接收方敏感,换句话说,须要更快地发现丢失了接收方,请考虑减少这个值。若是长期不活动的空闲链接出现次数较多,而丢失接收方的状况出现较少,您可能会要提升该值以减小开销。缺省状况下,若是空闲链接 7200000 毫秒(2 小时)内没有活动,Windows 就发送保持活动的消息。一般,1800000 毫秒是首选值,从而一半的已关闭链接会在 30 分钟内被检测到。 KeepAliveInterval 值定义了若是未从接收方收到保持活动消息的响应,TCP/IP 重复发送保持活动信号的频率。当连续发送保持活动信号、但未收到响应的次数超出 TcpMaxDataRetransmissions 的值时,会放弃该链接。若是指望较长的响应时间,您可能须要提升该值以减小开销。若是须要减小花在验证接收方是否已丢失上的时间,请考虑减少该值或 TcpMaxDataRetransmissions 值。缺省状况下,在未收到响应而从新发送保持活动的消息以前,Windows 会等待 1000 毫秒(1 秒)。 KeepAliveTime 根据你的须要设置就行,好比10分钟,注意要转换成MS。 XXX表明这个间隔值得大小。

 

2.Date头域

 

Date头域表示消息发送的时间,时间的描述格式由rfc822定义。例如,Date:Mon,31Dec200104:25:57GMT。Date描述的时间表示世界标准时,换算成本地时间,须要知道用户所在的时区。

 

3.Pragma头域

 

Pragma头域用来包含实现特定的指令,最经常使用的是Pragma:no-cache。在HTTP/1.1协议中,它的含义和Cache-Control:no-cache相同。

 

 

 

http请求消息

 

请求消息的第一行为下面的格式:

 

MethodSPRequest-URISPHTTP-VersionCRLFMethod表示对于Request-URI完成的方法,这个字段是大小写敏感的,包括OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE。方法GET和HEAD应该被全部的通用WEB服务器支持,其余全部方法的实现是可选的。GET方法取回由Request-URI标识的信息。HEAD方法也是取回由Request-URI标识的信息,只是能够在响应时,不返回消息体。POST方法能够请求服务器接收包含在请求中的实体信息,能够用于提交表单,向新闻组、BBS、邮件群组和数据库发送消息。

 

SP表示空格。Request-URI遵循URI格式,在此字段为星号(*)时,说明请求并不用于某个特定的资源地址,而是用于服务器自己。HTTP-Version表示支持的HTTP版本,例如为HTTP/1.1。CRLF表示换行回车符。请求头域容许客户端向服务器传递关于请求或者关于客户机的附加信
http架构
息。请求头域可能包含下列字段Accept、Accept-Charset、Accept-Encoding、Accept-Language、Authorization、From、Host、If-Modified-Since、If-Match、If-None-Match、If-Range、If-Range、If-Unmodified-Since、Max-Forwards、Proxy-Authorization、Range、Referer、User-Agent。对请求头域的扩展要求通信双方都支持,若是存在不支持的请求头域,通常将会做为实体头域处理。

 

典型的请求消息:

 

Host: download.*******.de

 

Accept: */*

 

Pragma: no-cache

 

Cache-Control: no-cache

 

User-Agent: Mozilla/4.04[en](Win95;I;Nav)

 

Range: bytes=554554-

 

上例第一行表示HTTP客户端(多是浏览器、下载程序)经过GET方法得到指定URL下的文件。棕色的部分表示请求头域的信息,绿色的部分表示通用头部分。

 

1.Host头域

 

Host头域指定请求资源的Intenet主机和端口号,必须表示请求url的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域,不然系统会以400状态码返回。

 

2.Referer头域

 

Referer头域容许客户端指定请求uri的源资源地址,这能够容许服务器生成回退链表,可用来登录、优化cache等。他也容许废除的或错误的链接因为维护的目的被追踪。若是请求的uri没有本身的uri地址,Referer不能被发送。若是指定的是部分uri地址,则此地址应该是一个相对地址。

 

3.Range头域

 

Range头域能够请求实体的一个或者多个子范围。例如,

 

表示头500个字节:bytes=0-499

 

表示第二个500字节:bytes=500-999

 

表示最后500个字节:bytes=-500

 

表示500字节之后的范围:bytes=500-

 

第一个和最后一个字节:bytes=0-0,-1

 

同时指定几个范围:bytes=500-600,601-999

 

可是服务器能够忽略此请求头,若是无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是以200(OK)。

 

4.User-Agent头域

 

User-Agent头域的内容包含发出请求的用户信息。

 

 

 

http响应消息

 

响应消息的第一行为下面的格式:

 

HTTP-VersionSPStatus-CodeSPReason-PhraseCRLF

 

HTTP-Version表示支持的HTTP版本,例如为HTTP/1.1。Status-Code是一个三个数字的结果代码。Reason-Phrase给Status-Code提供一个简单的文本描述。Status-Code主要用于机器自动识别,Reason-Phrase主要用于帮助用户理解。Status-Code的第一个数字定义响应的类别,后两个数字没有分类的做用。第一个数字可能取5个不一样的值:

 

1xx:信息响应类,表示接收到请求而且继续处理

 

2xx:处理成功响应类,表示动做被成功接收、理解和接受

 

3xx:重定向响应类,为了完成指定的动做,必须接受进一步处理

 

4xx:客户端错误,客户请求包含语法错误或者是不能正确执行

 

5xx:服务端错误,服务器不能正确执行一个正确的请求

 

响应头域容许服务器传递不能放在状态行的附加信息,这些域主要描述服务器的信息和Request-URI进一步的信息。响应头域包含Age、Location、Proxy-Authenticate、Public、Retry-After、Server、Vary、Warning、WWW-Authenticate。对响应头域的扩展要求通信双方都支持,若是存在不支持的响应头域,通常将会做为实体头域处理。

 

典型的响应消息:

 

HTTP/1.0200OK

 

Date:Mon,31Dec200104:25:57GMT

 

Server:Apache/1.3.14(Unix)

 

Content-type:text/html

 

Last-modified:Tue,17Apr200106:46:28GMT

 

Etag:"a030f020ac7c01:1e9f"

 

Content-length:39725426

 

Content-range:bytes55******/40279980

 

上例第一行表示HTTP服务端响应一个GET方法。棕色的部分表示响应头域的信息,绿色的部分表示通用头部分,红色的部分表示实体头域的信息。

 

1.Location响应头

 

Location响应头用于重定向接收者到一个新URI地址。

 

2.Server响应头

 

Server响应头包含处理请求的原始服务器的软件信息。此域能包含多个产品标识和注释,产品标识通常按照重要性排序。

 

 

 

http实体信息

 

请求消息和响应消息均可以包含实体信息,实体信息通常由实体头域和实体组成。实体头域包含关于实体的原信息,实体头包括Allow、Content-Base、Content-Encoding、Content-Language、Content-Length、Content-Location、Content-MD五、Content-Range、Content-Type、Etag、Expires、Last-Modified、extension-header。extension-header容许客户端定义新的实体头,可是这些域可能没法被接受方识别。实体能够是一个通过编码的字节流,它的编码方式由Content-Encoding或Content-Type定义,它的长度由Content-Length或Content-Range定义。

 

1.Content-Type实体头

 

Content-Type实体头用于向接收方指示实体的介质类型,指定HEAD方法送到接收方的实体介质类型,或GET方法发送的请求介质类型

 

2.Content-Range实体头

 

Content-Range实体头用于指定整个实体中的一部分的插入位置,他也指示了整个实体的长度。在服务器向客户返回一个部分响应,它必须描述响应覆盖的范围和整个实体长度。通常格式:

 

Content-Range:bytes-unitSPfirst-byte-pos-last-byte-pos/entity-legth

 

例如,传送头500个字节次字段的形式:Content-Range:bytes0-499/1234若是一个http消息包含此节(例如,对范围请求的响应或对一系列范围的重叠请求),Content-Range表示传送的范围,Content-Length表示实际传送的字节数。

 

3.Last-modified实体头

 

Last-modified实体头指定服务器上保存内容的最后修订时间。

 

例如,传送头500个字节次字段的形式:Content-Range:bytes0-499/1234若是一个http消息包含此节(例如,对范围请求的响应或对一系列范围的重叠请求),Content-Range表示传送的范围,Content-Length表示实际传送的字节数。

 

 

 

http运做方式

 

在WWW中,“客户”与“服务器”是一个相对的概念,只存在于一个特定的链接期间,即在某个链接中的客户在另外一个链接中可能做为服务器。基于HTTP协议的客户/服务器模式的信息交换过程,它分四个过程:创建链接、发送请求信息、发送响应信息、关闭链接。

 

HTTP协议是基于请求/响应范式的。一个客户机与服务器创建链接后,发送一个请求给服务器,请求方式的格式为,统一资源标识符、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。服务器接到请求后,给予相应的响应信息,其格式为一个状态行包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
http运做方式的一种
其实简单说就是任何服务器除了包括HTML文件之外,还有一个HTTP驻留程序,用于响应用户请求。你的浏览器是HTTP客户,向服务器发送请求,当浏览器中输入了一个开始文件或点击了一个超级连接时,浏览器就向服务器发送了HTTP请求,此请求被送往由IP地址指定的URL。驻留程序接收到请求,在进行必要的操做后回送所要求的文件。在这一过程当中,在网络上发送和接收的数据已经被分红一个或多个数据包(packet),每一个数据包包括:要传送的数据;控制信息,即告诉网络怎样处理数据包。TCP/IP决定了每一个数据包的格式。若是事先不告诉你,你可能不会知道信息被分红用于传输和再从新组合起来的许多小块。

 

许多HTTP通信是由一个用户代理初始化的而且包括一个申请在源服务器上资源的请求。最简单的状况多是在用户代理(UA)和源服务器(O)之间经过一个单独的链接来完成。

 

当一个或多个中介出如今请求/响应链中时,状况就变得复杂一些。中介有三种:代理(Proxy)、网关(Gateway)和通道(Tunnel)。一个代理根据URI的绝对格式来接受请求,重写所有或部分消息,经过URI的标识把已格式化过的请求发送到服务器。网关是一个接收代理,做为一些其它服务器的上层,而且若是必须的话,能够把请求翻译给下层的服务器协议。一个通道做为不改变消息的两个链接之间的中继点。当通信须要经过一个中介(例如:防火墙等)或者是中介不能识别消息的内容时,通道常常被使用。

 

 

 

http报文格式

 

HTTP报文由从客户机到服务器的请求和从服务器到客户机的响应构成。请求报文格式以下:

 

请求行 - 通用信息头 - 请求头 - 实体头 - 报文主体

 

请求行以方法字段开始,后面分别是 URL 字段和 HTTP 协议版本字段,并以 CRLF 结尾。SP 是分隔符。除了在最后的 CRLF 序列中 CF 和 LF 是必需的以外,其余均可以不要。有关通用信息头,请求头和实体头方面的具体内容能够参照相关文件。

 

应答报文格式以下:

 

状态行 - 通用信息头 - 响应头 - 实体头 - 报文主体

 

状态码元由3位数字组成,表示请求是否被理解或被知足。缘由分析是对原文的状态码做简短的描述,状态码用来支持自动操做,而缘由分析用来供用户使用。客户机无需用来检查或显示语法。有关通用信息头,响应头和实体头方面的具体内容能够参照相关文件。

 

 

 

http工做原理

 

一次HTTP操做称为一个事务,其工做过程可分为四步:

 

首先客户机与服务器须要创建链接。只要单击某个超级连接,HTTP的工做就开始了。

 

创建链接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。

 

服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。

 

客户端接收服务器所返回的信息经过浏览器显示在用户的显示屏上,而后客
http工做流程图
户机与服务器断开链接。

 

若是在以上过程当中的某一步出现错误,那么产生错误的信息将返回到客户端,由显示屏输出。对于用户来讲,这些过程是由HTTP本身完成的,用户只要用鼠标点击,等待信息显示就能够了。

 

许多HTTP通信是由一个用户代理初始化的而且包括一个申请在源服务器上资源的请求。最简单的状况多是在用户代理和服务器之间经过一个单独的链接来完成。在Internet上,HTTP通信一般发生在TCP/IP链接之上。缺省端口是TCP 80,但其它的端口也是可用的。但这并不预示着HTTP协议在Internet或其它网络的其它协议之上才能完成。HTTP只预示着一个可靠的传输。

 

这个过程就好像咱们打电话定货同样,咱们能够打电话给商家,告诉他咱们须要什么规格的商品,而后商家再告诉咱们什么商品有货,什么商品缺货。这些,咱们是经过电话线用电话联系(HTTP是经过TCP/IP),固然咱们也能够经过传真,只要商家那边也有传真。

 

 

 

http状态消息

 

1xx:信息
消息
描述
100 Continue
服务器仅接收到部分请求,可是一旦服务器并无拒绝该请求,客户端应该继续发送其他的请求。
101 Switching Protocols
服务器转换协议:服务器将听从客户的请求转换到另一种协议。

 

2xx:成功
消息
描述
200 OK
请求成功(其后是对GET和POST请求的应答文档。)
201 Created
请求被建立完成,同时新的资源被建立。
202 Accepted
供处理的请求已被接受,可是处理未完成。
203 Non-authoritative Information
文档已经正常地返回,但一些应答头可能不正确,由于使用的是文档的拷贝。
204 No Content
没有新文档。浏览器应该继续显示原来的文档。若是用户按期地刷新页面,而Servlet能够肯定用户文档足够新,这个状态代码是颇有用的。
205 Reset Content
没有新文档。但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容。
206 Partial Content
客户发送了一个带有Range头的GET请求,服务器完成了它。

 

3xx:重定向
消息
描述
300 Multiple Choices
多重选择。连接列表。用户能够选择某连接到达目的地。最多容许五个地址。
301 Moved Permanently
所请求的页面已经转移至新的url。
302 Found
所请求的页面已经临时转移至新的url。
303 See Other
所请求的页面可在别的url下被找到。
304 Not Modified
未按预期修改文档。客户端有缓冲的文档并发出了一个条件性的请求(通常是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还能够继续使用。
305 Use Proxy
客户请求的文档应该经过Location头所指明的代理服务器提取。
306  Unused
此代码被用于前一版本。目前已再也不使用,可是代码依然被保留。
307 Temporary Redirect
被请求的页面已经临时移至新的url。

 

4xx:客户端错误
消息
描述
400 Bad Request
服务器未能理解请求。
401 Unauthorized
被请求的页面须要用户名和密码。
401.1
登陆失败。
401.2
服务器配置致使登陆失败。
401.3
因为 ACL 对资源的限制而未得到受权。
401.4
筛选器受权失败。
401.5
ISAPI/CGI 应用程序受权失败。
401.7
访问被 Web 服务器上的 URL 受权策略拒绝。这个错误代码为 IIS 6.0 所专用。
402 Payment Required
此代码尚没法使用。
403 Forbidden
对被请求页面的访问被禁止。
403.1
执行访问被禁止。
403.2
读访问被禁止。
403.3
写访问被禁止。
403.4
要求 SSL。
403.5
要求 SSL 128。
403.6
IP 地址被拒绝。
403.7
要求客户端证书。
403.8
站点访问被拒绝。
403.9
用户数过多。
403.10
配置无效。
403.11
密码更改。
403.12
拒绝访问映射表。
403.13
客户端证书被吊销。
403.14
拒绝目录列表。
403.15
超出客户端访问许可。
403.16
客户端证书不受信任或无效。
403.17
客户端证书已过时或还没有生效。
403.18
在当前的应用程序池中不能执行所请求的 URL。这个错误代码为 IIS 6.0 所专用。
403.19
不能为这个应用程序池中的客户端执行 CGI。这个错误代码为 IIS 6.0 所专用。
403.20
Passport 登陆失败。这个错误代码为 IIS 6.0 所专用。
404 Not Found
服务器没法找到被请求的页面。
404.0
(无)–没有找到文件或目录。
404.1
没法在所请求的端口上访问 Web 站点。
404.2
Web 服务扩展锁定策略阻止本请求。
404.3
MIME 映射策略阻止本请求。
405 Method Not Allowed
请求中指定的方法不被容许。
406 Not Acceptable
服务器生成的响应没法被客户端所接受。
407 Proxy Authentication Required
用户必须首先使用代理服务器进行验证,这样请求才会被处理。
408 Request Timeout
请求超出了服务器的等待时间。
409 Conflict
因为冲突,请求没法被完成。
410 Gone
被请求的页面不可用。
411 Length Required
"Content-Length" 未被定义。若是无此内容,服务器不会接受请求。
412 Precondition Failed
请求中的前提条件被服务器评估为失败。
413 Request Entity Too Large
因为所请求的实体的太大,服务器不会接受请求。
414 Request-url Too Long
因为url太长,服务器不会接受请求。当post请求被转换为带有很长的查询信息的get请求时,就会发生这种状况。
415 Unsupported Media Type
因为媒介类型不被支持,服务器不会接受请求。
416 Requested Range Not Satisfiable
服务器不能知足客户在请求中指定的Range头。
417 Expectation Failed
执行失败。
423
锁定的错误。

 

5xx:服务器错误
消息
描述
500 Internal Server Error
请求未完成。服务器遇到不可预知的状况。
500.12
应用程序正忙于在 Web 服务器上从新启动。
500.13
Web 服务器太忙。
500.15
不容许直接请求 Global.asa。
500.16
UNC 受权凭据不正确。这个错误代码为 IIS 6.0 所专用。
500.18
URL 受权存储不能打开。这个错误代码为 IIS 6.0 所专用。
500.100
内部 ASP 错误。
501 Not Implemented
请求未完成。服务器不支持所请求的功能。
502 Bad Gateway
请求未完成。服务器从上游服务器收到一个无效的响应。
502.1
CGI 应用程序超时。 ·
502.2
CGI 应用程序出错。
503 Service Unavailable
请求未完成。服务器临时过载或当机。
504 Gateway Timeout
网关超时。
505 HTTP Version Not Supported
服务器不支持请求中指明的HTTP协议版本。

 

 

 

http版本历史

 

超文本传输协议已经演化出了不少版本,它们中的大部分都是向下兼容的。在RFC 2145中描述了HTTP
配置http通行证
版本号的用法。客户端在请求的开始告诉服务器它采用的协议版本号,然后者则在响应中采用相同或者更早的协议版本。

 

0.9 已过期。只接受 GET 一种请求方法,没有在通信中指定版本号,且不支持请求头。因为该版本不支持 POST 方法,因此客户端没法向服务器传递太多信息。

 

HTTP/1.0 这是第一个在通信中指定版本号的HTTP 协议版本,至今仍被普遍采用,特别是在代理服务器中。

 

HTTP/1.1 当前版本。持久链接被默认采用,并能很好地配合代理服务器工做。还支持以管道方式同时发送多个请求,以便下降线路负载,提升传输速度。

 

HTTP/1.1相较于 HTTP/1.0 协议的区别主要体如今:

 

1 缓存处理

 

2 带宽优化及网络链接的使用

 

3 错误通知的管理

 

4 消息在网络中的发送

 

5 互联网地址的维护

 

6 安全性及完整性
 

六、arguments是什么

JavaScript arguments对象

一、在JavaScript中,arguments对象是比较特别的一个对象,其实是当前函数的一个内置属性。arguments很是相似Array,但实际上又不是一个Array实例。能够经过以下代码得以证明(固然,实际上,在函数funcArg中,调用arguments是没必要要写成funcArg.arguments,直接写arguments便可)。

复制代码
1 Array.prototype.testArg = "test";
2 function funcArg() {
3     alert(funcArg.arguments.testArg);  
4     alert(funcArg.arguments[0]);
5 }
6 
7 alert(new Array().testArg); // result: "test"
8 funcArg(10);                // result: "undefined"  "10"
复制代码

二、arguments对象的长度是由实参个数而不是形参个数决定的。形参是函数内部从新开辟内存空间存储的变量,可是其与arguments对象内存空间并不重叠。对于arguments和值都存在的状况下,二者值是同步的,可是针对其中一个无值的状况下,对于此无值的情形值不会得以同步。以下代码能够得以验证。

复制代码
 1 function f(a, b, c){
 2     alert(arguments.length);   // result: "2"
 3     a = 100;
 4     alert(arguments[0]);       // result: "100"
 5     arguments[0] = "qqyumidi";
 6     alert(a);                  // result: "qqyumidi"
 7     alert(c);                  // result: "undefined"
 8     c = 2012;
 9     alert(arguments[2]);       // result: "undefined"
10 }
11 
12 f(1, 2);
复制代码

三、由JavaScript中函数的声明和调用特性,能够看出JavaScript中函数是不能重载的。

根据其余语言中重载的依据:"函数返回值不一样或形参个数不一样",咱们能够得出上述结论:

第一:Javascript函数的声明是没有返回值类型这一说法的;

第二:JavaScript中形参的个数严格意义上来说只是为了方便在函数中的变量操做,实际上实参已经存储在arguments对象中了。

另外,从JavaScript函数自己深刻理解为何JavaScript中函数是不能重载的:在JavaScript中,函数其实也是对象,函数名是关于函数的引用,或者说函数名自己就是变量。对于以下所示的函数声明与函数表达式,其实含以上是同样的(在不考虑函数声明与函数表达式区别的前提下),很是有利于咱们理解JavaScript中函数是不能重载的这一特性。

复制代码
 1 function f(a){
 2     return a + 10;
 3 }
 4 
 5 function f(a){
 6     return a - 10;
 7 }
 8 
 9 // 在不考虑函数声明与函数表达式区别的前提下,其等价于以下
10 
11 var f = function(a){
12     return a + 10;
13 }
14 
15 var f = function(a){
16     return a - 10;
17 }
复制代码

四、arguments对象中有一个很是有用的属性:callee。arguments.callee返回此arguments对象所在的当前函数引用。在使用函数递归调用时推荐使用arguments.callee代替函数名自己。

以下:

1 function count(a){
2     if(a==1){
3         return 1;
4     } 
5     return a + arguments.callee(--a);
6 }
7 
8 var mm = count(10);
9 alert(mm);
相关文章
相关标签/搜索