今天去携程面试了,感觉好难过,因为被面试官深深的鄙视了一顿,还是自己技术不到位,如果很厉害的话,我就会很有底气跟他争论。另外,基础需要加强,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();
动态原型方式,与混合的构造函数/原型方式类似,只是,放置原型方法的位置不同。