今天去携程面试了,感觉好难过,因为被面试官深深的鄙视了一顿,还是自己技术不到位,如果很厉害的话,我就会很有底气跟他争论。另外,基础需要加强,js方面的,设置缓存这块,总体感觉他问不难,都很基础,只是作品被他深深的鄙视了一顿,好难受,觉得世界都没爱了,天昏地暗的,从上海做高铁回来的路上,一直郁闷,一直郁闷,然后跟朋友吐槽,谢谢林开茂同孩的安慰,现在好很多了,起码看到自己的不足,进步空间还有很大,加油,加油,努力学,好好学,认真学,思考学!就算被别人再怎么鄙视,自己一定不能灰心,心态放好点,明天继续向前看。

面试问题

  1.客户端浏览器如何设置缓存?

  

   重点:在http头部增加Last-Modified,If-Modified-Since,Expires,Cache-Control等标识,来与服务器进行协议。其中Last-Modified,If-Modified-Since会与服务器进行联系,而Expires,Cache-Control则是直接判断它是否过期等,直接从客户端加载显示页面。

  2.什么叫委托事件?

   即事件代理,利用冒泡原理,将某一元素的事件,委托给其它元素处理的事件。

   好处:提高性能  |  新添加的元素,依然保留了该事件。

   举列说明:Ul和Li的事件委托。

 3.如何进行web页面优化?

   

   从页面级别角度:

   减少http请求 ,合理设置缓存,资源合并与压缩,css sprites,将样式位于头部,脚本放在底部,尽量使用外部的js和css文件,精简js,css,动态加载样式和文件,避免重复脚本,Etag的使用,Ajax请求缓存。使用get方法才能在客户端进行缓存,减少js阻塞。

   从代码级别角度:

  DOM操作优化,css选择器优化,图片优化,html结构优化

  从服务器端优化角度:

  CDN托管,减少dns查找,避免重定向,方向代理,负载均衡,memcache

 4:创建对象的几种方式有哪些?

    一:一般说来使用对象有三种:

   1:本地对象:独立于宿主环境的ECMAScript实现提供的对象。比如:object,array,string,Date,.......

   2:内置对象:只有Global和Math,每个内置对象都是本地对象。

   3:宿主对象:所有非本地对象都是宿主对象。

   Global对象作用:

   实际不存在的对象,在ECMAscript中,不存在独立的函数,所有函数都必须是某个对象的方法。像isNaN(),isFinite(),parseInt(),parseInt()等,实际上都是Global对象的方法。其次包括encodeURI()和encodeURIComponent()方法,用于编码传递给浏览器的URI(统一资源标识符)

  两者区别:encodeURI() 不对特殊字符进行编码,如冒号,前斜杠号,问号,英镑号,而后者对他们进行编码。

  解码编码过的URI用decodeURI 和decodeURIComponent方法.

  二:创建对象的方式

        包括工厂方式,构造函数,原型方式,动态原型方式等四种。看一下区别

        1:工厂方式:特征为返回特定类型对象。先看下代码

/*var  sUrl="http://www.baidu.com/illegal  value.html";
alert(encodeURI(sUrl));
alert(encodeURIComponent(sUrl));*/
//工厂方式
function  createCar()
{
    var  oCar=new  Object;
    oCar.color="red";
    oCar.doors="44";
    oCar.showColor=function()
    {
       alert(this.color);
    }
    return oCar;
}
var  oCar1=createCar();
oCar1.showColor();
var  oCar2=createCar();

最初,工厂方式是这种,但这种方式意味着,每次调用createCar方式,都要重新创建showColor函数,每个对象都有自己的showColor版本,事实上,每个对象都共享了同一个函数。后来,开发者在工厂函数外定义方法,通过对象属性指向该方法。代码如下:

//工厂方式
function  showColor()
{
    alert(this.color);
}
function  createCar(scolor,sdoors)
{
    var  oCar=new  Object;
    oCar.color=scolor;
    oCar.doors=sdoors;
    oCar.showColor=showColor;
    return oCar;
}
var  oCar1=createCar("red","4");
oCar1.showColor();
var  oCar2=createCar("blue","5");
oCar2.showColor();

        但这种方式看起来不像函数对象方法,因此,构造函数便出现了。

       2:构造函数方式

            特征:构造函数内部无创建对象,而是使用this指针,使用new运算符调用构造函数,先创建一个对象,只有这样this才能访问该对象。

      可以直接赋予this属性。不需要返回值。我们来看下代码:

//构造函数
function  createCar(scolor,sdoors)
{
    
    this.color=scolor;
    this.doors=sdoors;
    this.showColor=function(){alert(this.color)};
  
}
var  oCar1=new createCar("red","4");
oCar1.showColor();
var  oCar2=new createCar("blue","5");
oCar2.showColor();

        3:原型方式

         特征:利用prototype属性,用空构造函数来设置类名,把所有的属性和方法都被直接赋予prototype属性。先来看看最开始的原型方式

//原型方式
function  createCar(){}
createCar.prototype.color="red";
createCar.prototype.doors="22";
createCar.prototype.showColor=function(){alert(this.color)};
var  car1=new createCar();
car1.showColor();
var  car2=new createCar();
car2.showColor();

该方式的原型方式,并不能传参,因此,混合构造函数/原型方式便出现了。

     混合的构造函数/原型方式特征:属性用构造函数赋予,方法用prototype表示。代码如下所示:

//混合构造函数与原型方式
function createCar(scolor,sdoor){
   this.color=scolor;
   this.doors=sdoor;
}
createCar.prototype.showColor=function(){alert(this.color)}
var  car1=new createCar("red","33");
car1.showColor();
var  car2=new createCar("blue","44");
car2.showColor();

  动态原型方式,与混合的构造函数/原型方式类似,只是,放置原型方法的位置不同。