2016年前端实习生招聘面试题整理 2

posted @ May 6, 2016 • 陈凯 • 笔试面试

摘要:「本篇文章继续上次的实习生面试题,进行了总结,更多的实际操作题,需要具体到代码分析中。」


2016年前端实习生招聘面试题的整理2

1、前端开发有哪些优化问题?

  • 减少http请求次数:css spirit,data uri
  • JS,CSS源码压缩
  • 前端模板 JS+数据,减少由于HTML标签导致的带宽浪费,前端用变量保存AJAX请求结果,每次操作本地变量,不用请求,减少请求次数
  • 用innerHTML代替DOM操作,减少DOM操作次数,优化javascript性能
  • 用setTimeout来避免页面失去响应
  • 用hash-table来优化查找
  • 当需要设置的样式很多时设置className而不是直接操作style
  • 少用全局变量
  • 缓存DOM节点查找的结果
  • 避免使用CSS Expression
  • 图片预载
  • 避免在页面的主体布局中使用table,table要等其中的内容完全下载之后才会显示出来,显示比div+css布局慢

2、如何规避javascript多人开发函数重名问题?

答案: + 可以开发前规定命名规范,根据不同开发人员开发的功能在函数前加前缀 + 将每个开发人员的函数封装到类中,调用的时候就调用类的函数,即使函数重名只 要类名不重复就行

3、JavaScript有哪几种数据类型?

答案:简单,Number,Boolean,String,Null,Undefined;复合,Object,Array,Function

4、截取字符串“abcdefghi”的“fghi”

var myvalue=”abcdefghi”;
var jiequ=myvalue.substring(myvalue.length-4,myvalue.length);
alert(jiequ);

5、写出下面的运算结果

alert(typeof(null)); // object
alert(typeof(undefined)); // undefined
alert(typeof(NaN)); // number
alert(NaN==undefined); // false
alert(NaN==NaN); // false
var str="123abc";
alert(typeof(str++)); // number
alert(str);// NaN

6、问执行完毕后 x, y, z 的值分别是多少?

var x = 1, y = z = 0;
function add(n) {
    n = n+1;
}
y = add(x);
function add(n) {
    n = n + 3;
}
z = add(x);
答案:1、undefined、undefined

7、push()、pop()、shift()、unshift()分别是什么功能?

/*push 方法
将新元素添加到一个数组中,并返回数组的新长度值。*/
var a=[1,2,3,4];
a.push(5);
/*pop 方法
移除数组中的最后一个元素并返回该元素。*/
var a=[1,2,3,4];
a.pop();
/*shift 方法
移除数组中的第一个元素并返回该元素。*/
var a=[1,2];
alert(a.shift());
/*unshift 方法
将指定的元素插入数组开始位置并返回该数组。*/

8、如何阻止事件的冒泡?

答案:

//阻止冒泡的方法
function stopPP(e){
    var evt = e|| window.event;
    //IE用cancelBubble=true来阻止而FF下需要用stopPropagation方法
    evt.stopPropagation ?evt.stopPropagation() : (evt.cancelBubble=true);
}

9、写出程序运行的结果? 
for(var i=0, j=0; i<10, j<6; i++, j++){
    k = i + j;
}
答案:10

10、编写一个方法 求一个字符串的字节长度

答案: /*假设:

一个英文字符占用一个字节,一个中文字符占用两个字节*/

function getBytes(str){
    var len = str.length,
        bytes = len,
        i = 0;
    for(; i<len; i++){
        if (str.charCodeAt(i) > 255) bytes++;
    }
    return bytes;
}
alert(getBytes("玩,as"));

11、JavaScript中如何对一个对象进行深度clone?

答案:

function cloneObject(o) {
    if(!o || 'object' !== typeof o) {
        return o;
    }
    var c = 'function' === typeof o.pop ? [] : {};
    var p, v;
    for(p in o) {
        if(o.hasOwnProperty(p)) {
            v = o[p];
            if(v && 'object' === typeof v) {
                c[p] = Ext.ux.clone(v);
            }
            else {
                c[p] = v;
            }
        }
    }
    return c;
};

12、如何控制alert中的换行?

答案: \n alert(“p\np”);

13、请编写一个JavaScript函数 parseQueryString,

它的用途是把URL参数解析为一个对象,如:

var url = “http://witmax.cn/index.php?key0=0&key1=1&key2=2″; 答案:

function parseQueryString(url){
    var params = {},
        arr = url.split("?");
    if (arr.length <= 1)
        return params;
    arr = arr[1].split("&");
    for(var i=0, l=arr.length; i<l; i++){
        var a = arr[i].split("=");
        params[a[0]] = a[1];
    }
    return params;
}
var url = "http://witmax.cn/index.php?key0=0&key1=1&key2=2",
    ps = parseQueryString(url);
console.log(ps["key1"]);

14、如何控制网页在网络传输过程中的数据量?

答案:启用GZIP压缩 保持良好的编程习惯,避免重复的CSS,JavaScript代码,多余的HTML标签和属性

15、以下代码运行结果

function say() {
    // Local variable that ends up within closure
    var num = 888;
    var sayAlert = function() { alert(num); }
    num++;
    return sayAlert;
}

var sayAlert = say();
sayAlert()
答案:889

16、请实现ECMAScript 5中的Object.getPrototypeOf() 函数

答案:

function proto(object) {
    return !object?                null
        : '__proto__' in object?  object.__proto__
        : /* not exposed? */      object.constructor.prototype
}

17、如何实现Array.prototype.forEach?

答案:

if (!Array.prototype.forEach) {
    Array.prototype.forEach = function(fn){
        for ( var i = 0; i < this.length; i++ ) {
            fn( this[i], i, this );
        }
    };
}

["a", "b", "c"].forEach(function(value, index, array){
    assert( value, "Is in position " + index + " out of " + (array.length - 1) );
});

18、如何将arguments转为数组?

答案: Object.prototype.slice.call(arguments);

19、以下程序运行结果?

var ninja = function myNinja(){
    alert(ninja == myNinja);
};
ninja();
myNinja();
答案:true、报错(error - myNinja is not defined.)

20、如何获取光标的水平位置?

答案:

function getX(e){
    e = e || window.event;
    //先检查非IE浏览器,在检查IE的位置
    return e.pageX || e.clentX + document.body.scrollLeft;
}

21、兼容浏览器的获取指定元素(elem)的样式属性(name)的方法

答案:

function getStyle(elem, name){
    if(elem.style[name]){//如果属性存在于style[]中,直接取
        return elem.style[name];
}
else if(elem.currentStyle){//否则 尝试IE的方法
        return elem.currentStyle[name];
}//尝试W3C的方式
else if(document.defaultView && document.defaultView.getComputedStyle){ 
        name = name.replace(/([A-Z])/g, "-$1");//W3C中为textAlign样式,转为text-align
        name = name.toLowerCase();
        var s = document.defaultView.getComputedStyle(elem, "");
        return s && s.getPropertyValue(name);
    }else{
        return null;
    }
}

22、Javascript中实现类似PHP的print_r函数

答案:

function print_r(theObj) {
    var retStr = '';
    if (typeof theObj == 'object') {
        retStr += '<div style="font-family:Tahoma; font-size:7pt;">';
        for (var p in theObj) {
            if (typeof theObj[p] == 'object') {
                retStr += '<div><b>['+p+'] => ' + typeof(theObj) + '</b></div>';
                retStr += '<div style="padding-left:25px;">' + print_r(theObj[p]) + '</div>';
            } else {
                retStr += '<div>['+p+'] => <b>' + theObj[p] + '</b></div>';
            }
        }
        retStr += '</div>';
    }
    return retStr;
}

23、以下程序运行结果?

var b = parseInt("01");
alert("b="+b);
var c = parseInt("09/08/2009");
alert("c="+c);
答案:是b=1、c=0。

24、以下程序的运行结果?

var foo = 'hello';

(function() {
    var foo = foo || 'world';
    console.log(foo);
})();
答案:world

26、什么是ajax,为什么要使用Ajax(请谈一下你对Ajax的认识)?

答案:AJAX是“Asynchronous JavaScript and XML”的缩写。他是指一种创建交互式网页应用的网页开发技术。

Ajax包含下列技术:

  • 基于web标准(standards-based presentation)XHTML+CSS的表示;
  • 使用 DOM(Document Object Model)进行动态显示及交互;
  • 使用 XML 和 XSLT 进行数据交换及相关操作;
  • 使用 XMLHttpRequest 进行异步数据查询、检索;
  • 使用 JavaScript 将所有的东西绑定在一起。

为什么要用ajax:Ajax应用程序的优势在于:

  • 通过异步模式,提升了用户体验
  • 优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用
  • Ajax引擎在客户端运行,承担了一部分本来由服务器承担的工作,从而减少了大用户量下的服务器负载。

27、AJAX请求总共有多少种CALLBACK

答案: + Ajax请求总共有八种Callback + onSuccess + onFailure + onUninitialized + onLoading + onLoaded + onInteractive + onComplete + onException

28、请给出异步加载js方案,不少于两种

答案:默认情况javascript是同步加载的,也就是javascript的加载时阻塞的,后面的元素要等待javascript加载完毕后才能进行再加载,对于一些意义不是很大的javascript,如果放在页头会导致加载很慢的话,是会严重影响用户体验的。 异步加载方式: + defer,只支持IE + async: + 创建script,插入到DOM中,加载完毕后callBack,见代码:

function loadScript(url, callback){
   var script = document.createElement("script")
   script.type = "text/javascript";
   if (script.readyState){ //IE
      script.onreadystatechange = function(){
         if (script.readyState == "loaded" ||
            script.readyState == "complete"){
            script.onreadystatechange = null;
            callback();
         }
      };
   } else { //Others: Firefox, Safari, Chrome, and Opera
      script.onload = function(){
          callback();
      };
   }
   script.src = url;
   document.body.appendChild(script);
}