BAT及各大互联网公司2014前端笔试面试题:JavaScript篇

很多面试题是我自己面试BAT亲身经历碰到的。整理分享出来希望更多的前端er共同进步吧,不仅适用于求职者,对于巩固复习前端基础更是大有裨益。

而更多的题目是我一路以来收集的,也有往年的,答案不确保一定正确,如有错误或有更好的解法,还请斧正。

前面几题是会很基础,越下越有深度。

附上第二篇:BAT及各大互联网公司2014前端笔试面试题–Html,Css篇

前面几题是会很基础,越下越有深度。

初级Javascript:

1.JavaScript是一门什么样的语言,它有哪些特点?

没有标准答案。

2.JavaScript的数据类型都有什么?

基本数据类型:String,boolean,Number,Undefined, Null

引用数据类型:Object(Array,Date,RegExp,Function)

那么问题来了,如何判断某变量是否为数组数据类型?

  • 方法一.判断其是否具有“数组性质”,如slice()方法。可自己给该变量定义slice方法,故有时会失效
  • 方法二.obj instanceof Array 在某些IE版本中不正确
  • 方法三.方法一二皆有漏洞,在ECMA Script5中定义了新方法Array.isArray(), 保证其兼容性,最好的方法如下:

3.已知ID的Input输入框,希望获取这个输入框的输入值,怎么做?(不使用第三方框架)

4.希望获取到页面中所有的checkbox怎么做?(不使用第三方框架)

5.设置一个已知ID的DIV的html内容为xxxx,字体颜色设置为黑色(不使用第三方框架)

6.当一个DOM节点被点击时候,我们希望能够执行一个函数,应该怎么做?

  •  直接在DOM里绑定事件:<div onclick=”test()”></div>
  •  在JS里通过onclick绑定:xxx.onclick = test
  •  通过事件添加进行绑定:addEventListener(xxx, ‘click’, test)

那么问题来了,Javascript的事件流模型都有什么?

  • “事件冒泡”:事件开始由最具体的元素接受,然后逐级向上传播
  • “事件捕捉”:事件由最不具体的节点先接收,然后逐级向下,一直到最具体的
  • “DOM事件流”:三个阶段:事件捕捉,目标阶段,事件冒泡

7.什么是Ajax和JSON,它们的优缺点。

Ajax是异步JavaScript和XML,用于在Web页面中实现异步数据交互。

优点:

  •  可以使得页面不重载全部内容的情况下加载局部内容,降低数据传输量
  •  避免用户不断刷新或者跳转页面,提高用户体验

缺点:

  •  对搜索引擎不友好(
  •  要实现ajax下的前后退功能成本较大
  •  可能造成请求数的增加
  •  跨域问题限制

JSON是一种轻量级的数据交换格式,ECMA的一个子集

优点:轻量级、易于人的阅读和编写,便于机器(JavaScript)解析,支持复合数据类型(数组、对象、字符串、数字)

 8.看下列代码输出为何?解释原因。

解释:Undefined是一个只有一个值的数据类型,这个值就是“undefined”,在使用var声明变量但并未对其赋值进行初始化时,这个变量的值就是undefined。而b由于未声明将报错。注意未申明的变量和声明了未赋值的是不一样的。

 9.看下列代码,输出什么?解释原因。

解释:null是一个只有一个值的数据类型,这个值就是null。表示一个空指针对象,所以用typeof检测会返回”object”。

 10.看下列代码,输出什么?解释原因。

  • undefined与null相等,但不恒等(===)
  • 一个是number一个是string时,会尝试将string转换为number
  • 尝试将boolean转换为number,0或1
  • 尝试将Object转换成number或string,取决于另外一个对比量的类型
  • 所以,对于0、空字符串的判断,建议使用 “===” 。“===”会先判断两边的值类型,类型不匹配时为false。

那么问题来了,看下面的代码,输出什么,foo的值为什么?

执行完后foo的值为111,foo的类型为String。

 11.看代码给答案。

答案:2(考察引用数据类型细节

12.已知数组var stringArray = [“This”, “is”, “Baidu”, “Campus”],Alert出”This is Baidu Campus”。

答案:alert(stringArray.join(“”))

已知有字符串foo=”get-element-by-id”,写一个function将其转化成驼峰表示法”getElementById”。

(考察基础API)

13.var numberArray = [3,6,2,4,1,5]; (考察基础API

1) 实现对该数组的倒排,输出[5,1,4,2,6,3]

2) 实现对该数组的降序排列,输出[6,5,4,3,2,1]

14.输出今天的日期,以YYYY-MM-DD的方式,比如今天是2014年9月26日,则输出2014-09-26

15.将字符串”<tr><td>{$id}</td><td>{$name}</td></tr>”中的{$id}替换成10,{$name}替换成Tony (使用正则表达式)

答案:”<tr><td>{$id}</td><td>{$id}_{$name}</td></tr>”.replace(/{\$id}/g, ’10’).replace(/{\$name}/g, ‘Tony’);

16.为了保证页面输出安全,我们经常需要对一些特殊的字符进行转义,请写一个函数escapeHtml,将<, >, &, “进行转义

17.foo = foo||bar ,这行代码是什么意思?为什么要这样写?

答案:if(!foo) foo = bar; //如果foo存在,值不变,否则把bar的值赋给foo。

短路表达式:作为”&&”和”||”操作符的操作数表达式,这些表达式在进行求值时,只要最终的结果已经可以确定是真或假,求值过程便告终止,这称之为短路求值。

18.看下列代码,将会输出什么?(变量声明提升)

答案:输出undefined 和 2。上面代码相当于:

函数声明与变量声明会被JavaScript引擎隐式地提升到当前作用域的顶部,但是只提升名称不会提升赋值部分。

19.用js实现随机选取10–100之间的10个数字,存入一个数组,并排序。

20.把两个数组合并,并删除第二个元素。

21.怎样添加、移除、移动、复制、创建和查找节点(原生JS,实在基础,没细写每一步)

1)创建新节点

createDocumentFragment()    //创建一个DOM片段

createElement()   //创建一个具体的元素

createTextNode()   //创建一个文本节点

2)添加、移除、替换、插入

appendChild()      //添加

removeChild()      //移除

replaceChild()      //替换

insertBefore()      //插入

3)查找

getElementsByTagName()    //通过标签名称

getElementsByName()     //通过元素的Name属性的值

getElementById()        //通过元素Id,唯一性

22.有这样一个URL:http://item.taobao.com/item.htm?a=1&b=2&c=&d=xxx&e,请写一段JS程序提取URL中的各个GET参数(参数名和参数个数不确定),将其按key-value形式返回到一个json结构中,如{a:’1′, b:’2′, c:”, d:’xxx’, e:undefined}。

答案:

23.正则表达式构造函数var reg=new RegExp(“xxx”)与正则表达字面量var reg=//有什么不同?匹配邮箱的正则表达式?

答案:当使用RegExp()构造函数的时候,不仅需要转义引号(即\”表示”),并且还需要双反斜杠(即\\表示一个\)。使用正则表达字面量的效率更高。 

邮箱的正则匹配:

24.看下面代码,给出输出结果。

答案:4 4 4。

原因:Javascript事件处理器在线程空闲之前不会运行。追问,如何让上述代码输出1 2 3?

25.写一个function,清除字符串前后的空格。(兼容所有浏览器)

使用自带接口trim(),考虑兼容性:

26.Javascript中callee和caller的作用?

答案:

caller是返回一个对函数的引用,该函数调用了当前函数;

callee是返回正在被执行的function函数,也就是所指定的function对象的正文。

那么问题来了?如果一对兔子每月生一对兔子;一对新生兔,从第二个月起就开始生兔子;假定每对兔子都是一雌一雄,试问一对兔子,第n个月能繁殖成多少对兔子?(使用callee完成

中级Javascript:

1.实现一个函数clone,可以对JavaScript中的5种主要的数据类型(包括Number、String、Object、Array、Boolean)进行值复制

  • 考察点1:对于基本数据类型和引用数据类型在内存中存放的是值还是指针这一区别是否清楚
  • 考察点2:是否知道如何判断一个变量是什么类型的
  • 考察点3:递归算法的设计

 

2.如何消除一个数组里面重复的元素?

3.小贤是一条可爱的小狗(Dog),它的叫声很好听(wow),每次看到主人的时候就会乖乖叫一声(yelp)。从这段描述可以得到以下对象:

小芒和小贤一样,原来也是一条可爱的小狗,可是突然有一天疯了(MadDog),一看到人就会每隔半秒叫一声(wow)地不停叫唤(yelp)。请根据描述,按示例的形式用代码来实。继承,原型,setInterval

答案:

4.下面这个ul,如何点击每一列的时候alert其index?(闭包

答案:

5.编写一个JavaScript函数,输入指定类型的选择器(仅需支持id,class,tagName三种简单CSS选择器,无需兼容组合选择器)可以返回匹配的DOM节点,需考虑浏览器兼容性和性能。

/*** @param selector {String} 传入的CSS选择器。* @return {Array}*/

答案:

6.请评价以下代码并给出改进意见。

评价:

  •  不应该在if和else语句中声明addListener函数,应该先声明;
  •  不需要使用window.addEventListener或document.all来进行检测浏览器,应该使用能力检测;
  •  由于attachEvent在IE中有this指向问题,所以调用它时需要处理一下

改进如下:

7.给String对象添加一个方法,传入一个string类型的参数,然后将string的每个字符间价格空格返回,例如:

addSpace(“hello world”) // -> ‘h e l l o  w o r l d’

接着上述问题答案提问,1)直接在对象的原型上添加方法是否安全?尤其是在Object对象上。(这个我没能答出?希望知道的说一下。) 2)函数声明与函数表达式的区别?

答案:在js中,解析器在向执行环境中加载数据时,对函数声明和函数表达式并非是一视同仁的,解析器会率先读取函数声明,并使其在执行任何代码之前可用(可以访问),至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被解析执行。

8.定义一个log方法,让它可以代理console.log的方法。

可行的方法一:

如果要传入多个参数呢?显然上面的方法不能满足要求,所以更好的方法是:

到此,追问apply和call方法的异同。

答案:

对于apply和call两者在作用上是相同的,即是调用一个对象的一个方法,以另一个对象替换当前对象。将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。

但两者在参数上有区别的。对于第一个参数意义都一样,但对第二个参数: apply传入的是一个参数数组,也就是将多个参数组合成为一个数组传入,而call则作为call的参数传入(从第二个参数开始)。 如 func.call(func1,var1,var2,var3)对应的apply写法为:func.apply(func1,[var1,var2,var3]) 。

9.在Javascript中什么是伪数组?如何将伪数组转化为标准数组?

答案:

伪数组(类数组):无法直接调用数组方法或期望length属性有什么特殊的行为,但仍可以对真正数组遍历方法来遍历它们。典型的是函数的argument参数,还有像调用getElementsByTagName,document.childNodes之类的,它们都返回NodeList对象都属于伪数组。可以使用Array.prototype.slice.call(fakeArray)将数组转化为真正的Array对象。

假设接第八题题干,我们要给每个log方法添加一个”(app)”前缀,比如’hello world!’ ->'(app)hello world!’。方法如下:

10.对作用域上下文和this的理解,看下列代码:

问两处console输出什么?为什么?

答案是1和undefined。

func是在winodw的上下文中被执行的,所以会访问不到count属性。

继续追问,那么如何确保Uesr总是能访问到func的上下文,即正确返回1。正确的方法是使用Function.prototype.bind。兼容各个浏览器完整代码如下:

11.原生JS的window.onload与Jquery的$(document).ready(function(){})有什么不同?如何用原生JS实现Jq的ready方法?

window.onload()方法是必须等到页面内包括图片的所有元素加载完毕后才能执行。

$(document).ready()是DOM结构绘制完毕后就执行,不必等到加载完毕。

如果上述代码十分难懂,下面这个简化版:

12.(设计题)想实现一个对页面某个节点的拖曳?如何做?(使用原生JS)

回答出概念即可,下面是几个要点

  1. 给需要拖拽的节点绑定mousedown, mousemove, mouseup事件
  2. mousedown事件触发后,开始拖拽
  3. mousemove时,需要通过event.clientX和clientY获取拖拽位置,并实时更新位置
  4. mouseup时,拖拽结束
  5. 需要注意浏览器边界的情况

13.

171232302169311

 

14.说出以下函数的作用是?空白区域应该填写什么?

答案:访函数的作用是使用format函数将函数的参数替换掉{0}这样的内容,返回一个格式化后的结果:

第一个空是:arguments

第二个空是:/\{(\d+)\}/ig

 15.用面向对象的Javascript来介绍一下自己。(没答案哦亲,自己试试吧)

答案: 对象或者Json都是不错的选择哦,

觉得题目还ok的亲点个推荐哦,题量会不断增加。

你可能会感兴趣:BAT及各大互联网公司2014前端笔试面试题–Html,Css篇

暂且贴出我做出答案的部分。有时间把未做出答案也贴出来。针对文中各题,如有更好的解决方法或者错误之处,各位亲务必告知我,误人子弟实乃罪过。

觉得题目还ok的亲点个推荐哦,题量会不断增加。

 

4 35 收藏 19 评论

相关文章

可能感兴趣的话题



直接登录
最新评论
  • 很好的文章,thx for sharing !

  • BR   2015/08/26

    第19题答案错误,正确答案应该是:
    var cArray = [];
    function getRandom(min,max){
    var choice = max-min+1;
    return Math.floor(Math.random()*choice+min);
    }
    for (var i = 0; i < 10; i++) {
    cArray.push(getRandom(10,100));
    };
    function compare(value1,value2){
    if (value1value2) {
    return 1;
    }else{
    return 0;
    };
    }
    cArray.sort(compare);

    • Hankewins   2015/08/26

      var arr = [];

      function randomNum(start, end, times){
      var choice = end - start + 1;
      var num = Math.floor(Math.random() * choice + start);

      if(times > 0){
      arr.push(num);
      arguments.callee(start, end, times-1);
      }

      return arr.sort(function(a,b){return a > b ? 1 : -1;});

      }

    • longming   2015/08/30

      其实没那么麻烦,因为没有个位数的,所以,在源码那里把choice 最后的+1去掉即可

    • 张建礼   2016/10/10

      比较函数部分条件 if(value1 > value2) 大于号少了。

  • zchub   2015/09/05

    第10题的答案好像有点问题,typeof foo 为number啊!

  • zchub   2015/09/05

    13题和12题答案一样?出错了

  • KnightSu   2015/09/07

    基础部分13题,
    倒排,
    var numberArray = [3,6,2,4,1,5];
    console.log(numberArray.reverse());

    降序,
    var numberArray = [3,6,2,4,1,5];
    function pailie(a,b){
    return b-a;
    }
    console.log(numberArray.sort(pailie));

  • KnightSu   2015/09/08

    elem['temp' + type + handler] = handler;
    elem[type + handler] = function(){
    elem['temp' + type + handler].apply(elem);

    这个是ECMASCRIPT 6 ?

      

  • 中级第二题
    else if(obj[arr[i]]==1) continue;
    这段代码不需要吧 不会走的
    去掉也能实现

    • KnightSu   2015/09/10

      这段是需要的。
      把arr[i]作为对象obj的属性,遍历arr[i],开始时(obj[arr[i]]==undefined,然后就进行数组复制,同时
      obj[arr[i]]==1,相当于置了一个标志位,接着继续遍历arr[i],发现arr[i]作为obj属性已经存在的即跳过数组复制,继续遍历。

  • eric   2015/12/27

    第6题我并不认为是在做浏览器嗅探,那么什么是浏览器嗅探:/android/.test(navigation.userAgent)

  • eric   2015/12/27

    第11题答案也不是很全面,jQuery的ready是一个promise对象,而且也用到了setTimeout,而不是简单的DOMContentLoded

  • Sharis   2016/04/08

    第十二题需要一个空格

  • 沉默_ml   2016/05/04

    数组去重用ES5的话 这样会快一点

    function deleteRepeatArray(arr) {
    var ret = []
    arr.forEach(function(a) {
    var isExistence = ret.some(function(b) {
    return a === b
    })

    !isExistence && ret.push(a)
    })

    return ret
    }

    看起来多了一层循环,但实测确实快了一点

    ps:博主的方法也可以再优化一下:

    function deRepeat(arr) {
    var ret = [], obj = {}, len = arr.length;
    for(var i = 0; i < len; i++) {
    if(obj[ arr[i] ] === undefined) {
    obj[ arr[i] ] = true
    ret.push(arr[i])
    }
    }

    return ret
    }

    • _j1AchA0   2016/12/29

      function deRepeat(arr){
      var newArr = arr.filter(function(item,index,array){
          return array.indexOf(item) == index;
      })
      return newArr;
      }

  • beard   2016/09/29

    初级的26题,如果是斐波那契数列,应该是一对新生兔过两个月之后开始生育,而不是从第二个月起吧

  • 谁能说说15题面向对象自我介绍啊,没头绪,谁能举个例子嘛,大神们

跳到底部
返回顶部