前端面试总结

  近来静极思动,想换个工作,就在网上撒了一遍简历,也面试了好几家。有谈妥的,有pass的,收获颇丰吧!

  我们前端找工作吧,如果个人技术已经登堂入室,想找找创业刺激之类的,可以去创业型公司耍耍,由于本人这几年纯属酱油型的,这方面,就不发表微薄的见识了。我觉得,我们技术一般般,需要增强技术能力的,需要找一些有大牛坐镇的公司,因为有时候大牛随手指点你一两下,你可能就会省去好几天的研究功夫,更别说,在行业内,大牛对于行业的发展,解决问题的思想,这些都是非常好的财富。so,本人就是想找找这类的公司。

  这几天,中共面试了4家公司,pass了好几家,嘿嘿。下面做一些个人的总结,顺便晒一晒一些问题。

  第一家公司,我让自己认识了以下的问题:由于我以前做的是企业型的官网,so,这一类东西,有什么可以说的呢?企业型官网反正就那么一点点东西,再怎么说,也不可能说出花儿来。所以,自己需要突出某方面的能力。这样面试的时候,可以增添话题,让面试官根据你的话题走。这样下来,该谈的都谈完了。反之,面试官就会问一些简历上面的东西,然后呢,开始深究一些问题,总而言之,你会被他挖到底。

  第二家公司,暴露了我自己对于知识认识的层次,很多东西只是做了了解。而真正使用却没有达到。或者说没有深入的挖掘。知识了解和掌握其中的差距真的是不可以道里计。

  第三家吧,我自己也烦了一些错误。首先,在自己题目没有看完的情况下,也就是说完全没有做好准备的情况下,跑去面试,当然,是我自己刚开始的想法也有问题(对那份工作不够重视,认为达不到),任何一份工作都可能是机会,所以,don't give up.其中呢,有一些题目,还是记得的:

1、那些不是鼠标事件:click\ contentMenu\mousehover\keydown;当时,我是十分确定keydown是键盘事件,不确定contentMenu 是啥事件(后来知道是鼠标右键),我会说我傻的多选了吗!

2、4097字节数据传递:indexDB\post\session\cookie\local storage;答案呢,是post;原因:

session,我们前端不能操控,虽说能传递数据,but不归我们管的,不能理。cookie:首先,不安全(题目没说,安不安全,这里可以忽略 )。但是,cookie存储数据大小是4K,4*1024=4096b,而我们要传递的数据是4097b,所以,使用cookie不行。而local storage,确实能够存储数据,但是,一个很重要的问题,这个数据只会存储在客户端,不会传递到服务器去。

这里介绍下local storage:(转自http://www.cnblogs.com/xiaowei0705/archive/2011/04/19/2021372.html)

首先自然是检测浏览器是否支持本地存储。在HTML5中,本地存储是一个window的属性,包括localStoragesessionStorage,从名字应该可以很清楚的辨认二者的区别,前者是一直存在本地的,后者只是伴随着session,窗口一旦关闭就没了。二者用法完全相同,这里以localStorage为例。

if(window.localStorage){
 alert('This browser supports localStorage');
}else{
 alert('This browser does NOT support localStorage');
}

 

存储数据的方法就是直接给window.localStorage添加一个属性,例如:window.localStorage.a 或者 window.localStorage["a"]。它的读取、写、删除操作方法很简单,是以键值对的方式存在的,如下:

localStorage.a = 3;//设置a"3"
localStorage["a"] = "sfsf";//设置a"sfsf",覆盖上面的值
localStorage.setItem("b","isaac");//设置b"isaac"
var a1 = localStorage["a"];//获取a的值
var a2 = localStorage.a;//获取a的值
var b = localStorage.getItem("b");//获取b的值
localStorage.removeItem("c");//清除c的值

 

这里最推荐使用的自然是getItem()setItem(),清除键值对使用removeItem()。如果希望一次性清除所有的键值对,可以使用clear()。另外,HTML5还提供了一个key()方法,可以在不知道有哪些键值的时候使用,如下:

var storage = window.localStorage;
function showStorage(){
 for(var i=0;i<storage.length;i++){
  //key(i)获得相应的键,再用getItem()方法获得对应的值
  document.write(storage.key(i)+ " : " + storage.getItem(storage.key(i)) + "<br>");
 }
}

 

写一个最简单的,利用本地存储的计数器:

var storage = window.localStorage;
if (!storage.getItem("pageLoadCount")) storage.setItem("pageLoadCount",0);
storage.pageLoadCount = parseInt(storage.getItem("pageLoadCount")) + 1;//必须格式转换
document.getElementByIdx_x("count").innerHTML = storage.pageLoadCount;
showStorage();

不断刷新就能看到数字在一点点上涨,如下图所示:

 

需要注意的是,HTML5本地存储只能存字符串,任何格式存储的时候都会被自动转为字符串,所以读取的时候,需要自己进行类型的转换。这也就是上一段代码中parseInt必须要使用的原因。

 

另外,在iPhone/iPad上有时设置setItem()时会出现诡异的QUOTA_EXCEEDED_ERR错误,这时一般在setItem之前,先removeItem()ok了。

 

HTML5的本地存储,还提供了一个storage事件,可以对键值对的改变进行监听,使用方法如下:

if(window.addEventListener){
 window.addEventListener("storage",handle_storage,false);
}else if(window.attachEvent){
 window.attachEvent("onstorage",handle_storage);
}
function handle_storage(e){
 if(!e){e=window.event;}
 //showStorage();
}

 

对于事件变量e,是一个StorageEvent对象,提供了一些实用的属性,可以很好的观察键值对的变化,如下表:

 Property

 Type

 Description

 key

 String

 The named key that was added, removed, or moddified

 oldValue

 Any

 The previous value(now overwritten), or null if a new item was added

 newValue

 Any

 The new value, or null if an item was added

 url/uri

 String

 The page that called the method that triggered this change

 

这里添加两个键值对ab,并增加一个按钮。给a设置固定的值,当点击按钮时,修改b的值:

<body>
<p>You have viewed this page <span id="count">0</span>  time(s).</p>
<p><input type="button" value="changeStorage" onClick="changeS()"/></p>
<script>
var storage = window.localStorage;
if (!storage.getItem("pageLoadCount")) storage.setItem("pageLoadCount",0);
storage.pageLoadCount = parseInt(storage.getItem("pageLoadCount")) + 1;//必须格式转换
document.getElementByIdx_x("count").innerHTML = storage.pageLoadCount;
showStorage();
if(window.addEventListener){
 window.addEventListener("storage",handle_storage,false);
}else if(window.attachEvent){
 window.attachEvent("onstorage",handle_storage);
}
function handle_storage(e){
 if(!e){e=window.event;}
 showObject(e);
}
function showObject(obj){
 //递归显示object
 if(!obj){return;}
 for(var i in obj){
  if(typeof(obj[i])!="object" || obj[i]==null){
   document.write(i + " : " + obj[i] + "<br/>");
  }else{
   document.write(i + " : object" + "<br/>");
  }
 }
}
storage.setItem("a",5);
function changeS(){
 //修改一个键值,测试storage事件
 if(!storage.getItem("b")){storage.setItem("b",0);}
 storage.setItem('b',parseInt(storage.getItem('b'))+1);
}
function showStorage(){
 //循环显示localStorage里的键值对
 for(var i=0;i<storage.length;i++){
  //key(i)获得相应的键,再用getItem()方法获得对应的值
  document.write(storage.key(i)+ " : " + storage.getItem(storage.key(i)) + "<br>");
 }
}
</script>
</body>

 

测试发现,目前浏览器对这个支持不太好,仅iPadFirefox支持,而且Firefox支持得乱糟糟,e对象根本没有那些属性。iPad支持非常好,用的是e.uri(不是e.url),台式机上的Safari不行,诡异。

 

目前浏览器都带有很好的开发者调试功能,下面分别是ChromeFirefox的调试工具查看LocalStorage



另外,目前javascript使用非常多的json格式,如果希望存储在本地,可以直接调用JSON.stringify()将其转为字符串。读取出来后调用JSON.parse()将字符串转为json格式,如下所示:

var details = {author:"isaac","description":"fresheggs","rating":100};
storage.setItem("details",JSON.stringify(details));
details = JSON.parse(storage.getItem("details"));

 

JSON对象在支持localStorage的浏览器上基本都支持,需要注意的是IE8,它支持JSON,但如果添加了如下的兼容模式代码,切到IE7模式就不行了(此时依然支持localStorage,虽然显示window.localStorage[object],而不是之前的[object Storage],但测试发现getItem()setItem()等均能使用)。

<meta content="IE=7" http-equiv="X-UA-Compatible"/>

 

 

接下来,使用正则表达式匹配url传递的参数;比如:

URL=http://www.baidu.com?a=1&b=2&c=3&d=4;

怎么拿到c的值?

这个题目,我开始用的是数组split(‘&’)方法分割。面试官说用正则,苦逼的写过一点点,由于自己开始的时候没看过题,想了一会,还是没写出来

这里大致的写一下:

 function _GETS(name, str) {
        var pattern = new RegExp('[\?&]' + name + '=([^&]+)', 'g');
        str = str || location.search;
        var arr, match = '';

        while ((arr = pattern.exec(str)) !== null) {
            match = arr[1];
        }

        return match;
 }

正则,由网上大神解释,我终于看懂了。

首先匹配的是以“?”或者“&”开头的字符([]里面的是或关系),

 [^&]+ 加号是量词 表示1个或多个 至少1个, 也就是[^&]不是&的字符 一个或多个 ,这里有个括号,每个括号是一个匹配组。 exec函数匹配到的结果 是一个数组 arr[0]放的是整个匹配的结果 arr[1]放的是 ([^&]+) 这个捕获组匹配的结果 ,
 所以arr[1]直接就取到了name的等号后面的内容 。
 
剩下的,比如数组去重啊,多维数组转换(先转换成字符串,然后split成数组)啊等等,反正算是简单的题目了。

第四家,记得清楚的就2题:

1、json格式传递数据怎么传递的?为啥这样用?

json主要传递数据post和get,get传递数据安全性不高,数据大小也有限制,而post安全性较高。

问:那么如果我要跨域怎么解决?

答:使用jsonp格式进行数据传递。

问:jsonp使用什么格式进行数据传递?为什么这么用?

答:post和get都可以。因为jsonp本质上是引入外部资源文件,与传统ajax没什么关系。

2、JavaScript又哪几种数据格式?怎么定义空?怎么定义undefined?怎么判断空和undefined?他们相等吗?

答:object,function,string,number,undefined,null;

var a=null;
var b;
if(a==b){}
if(a===b){}
if(!!a){}

剩下的零零散散的东西,就不讲了。

  总而言之,收获颇丰。感觉还有好多好多东西学。

posted on 2016-05-30 15:29  Newbies  阅读(144)  评论(0)    收藏  举报

导航