7个去伪存真的JavaScript面试题


Posted in Javascript onJanuary 07, 2016

下面这7个JavaScript面试问题是你应该在面试前先问的。否则,很有可能会浪费你的时间。
1.创建JavaScript对象的两种方法是什么?
这是一个非常简单的问题,如果你用过JavaScript的话。你至少得知道一种方法。但是,尽管如此,根据我的经验,也有很多自称是JavaScript程序员的人说不知道如何回答这个问题。

  • 使用“new”关键字来调用函数。
  • open/close花括号。

var o = {};
你也可以继续提问,“使用new关键字,什么情况下创建对象?”但是,由于我只是想淘汰一些人,所以这些问题我会等到真正面试的时候去问。
2.如何创建数组?
这和“如何创建对象”是相同级别的问题。然而,也有一些人回答得了第一个问题,却不能回答这个问题。
用下面的代码,简简单单就能创建一个数组:
var myArray = new Array();
创建数组是一个很复杂的过程。但是我希望能从应聘者口中听到使用方括号的答案。
var myArray = [];
当然,我们还可以继续问其他问题,比如如何高效地删除JavaScript数组中的重复元素等,但是由于我们只需要知道应聘人员是否值得进一步的观察,关于数组的问题我会到此结束。

再来针对如何高效地删除JavaScript数组中的重复元素说一说:js 如何实现数组去重整理出5种方法。

具体的方法介绍:

1).遍历数组法

最简单的去重方法, 实现思路:新建一新数组,遍历传入数组,值不在新数组就加入该新数组中;注意点:判断值是否在数组的方法“indexOf”是ECMAScript5 方法,IE8以下不支持,需多写一些兼容低版本浏览器代码,源码如下:

// 最简单数组去重法
function unique1(array){
 var n = []; //一个新的临时数组
 //遍历当前数组
 for(var i = 0; i < array.length; i++){
  //如果当前数组的第i已经保存进了临时数组,那么跳过,
  //否则把当前项push到临时数组里面
  if (n.indexOf(array[i]) == -1) n.push(array[i]);
 }
 return n;
}
// 判断浏览器是否支持indexOf ,indexOf 为ecmaScript5新方法 IE8以下(包括IE8, IE8只支持部分ecma5)不支持
if (!Array.prototype.indexOf){
 // 新增indexOf方法
 Array.prototype.indexOf = function(item){
  var result = -1, a_item = null;
  if (this.length == 0){
   return result;
  }
  for(var i = 0, len = this.length; i < len; i++){
   a_item = this[i];
   if (a_item === item){
    result = i;
    break;
   } 
  }
  return result;
 }
}

2).对象键值对法

该方法执行的速度比其他任何方法都快, 就是占用的内存大一些;实现思路:新建一js对象以及新数组,遍历传入数组时,判断值是否为js对象的键,不是的话给对象新增该键并放入新数组。注意点: 判断是否为js对象键时,会自动对传入的键执行“toString()”,不同的键可能会被误认为一样;例如: a[1]、a["1"] 。解决上述问题还是得调用“indexOf”。

// 速度最快, 占空间最多(空间换时间)
function unique2(array){
 var n = {}, r = [], len = array.length, val, type;
  for (var i = 0; i < array.length; i++) {
    val = array[i];
    type = typeof val;
    if (!n[val]) {
      n[val] = [type];
      r.push(val);
    } else if (n[val].indexOf(type) < 0) {
      n[val].push(type);
      r.push(val);
    }
  }
  return r;
}

3).数组下标判断法

还是得调用“indexOf”性能跟方法1差不多,实现思路:如果当前数组的第i项在当前数组中第一次出现的位置不是i,那么表示第i项是重复的,忽略掉。否则存入结果数组。

function unique3(array){
 var n = [array[0]]; //结果数组
 //从第二项开始遍历
 for(var i = 1; i < array.length; i++) {
  //如果当前数组的第i项在当前数组中第一次出现的位置不是i,
  //那么表示第i项是重复的,忽略掉。否则存入结果数组
  if (array.indexOf(array[i]) == i) n.push(array[i]);
 }
 return n;
}

4).排序后相邻去除法

虽然原生数组的”sort”方法排序结果不怎么靠谱,但在不注重顺序的去重里该缺点毫无影响。实现思路:给传入数组排序,排序后相同值相邻,然后遍历时新数组只加入不与前一值重复的值。

// 将相同的值相邻,然后遍历去除重复值
function unique4(array){
 array.sort(); 
 var re=[array[0]];
 for(var i = 1; i < array.length; i++){
  if( array[i] !== re[re.length-1])
  {
   re.push(array[i]);
  }
 }
 return re;
}

5).优化遍历数组法

源自外国博文,该方法的实现代码相当酷炫;实现思路:获取没重复的最右一值放入新数组。(检测到有重复值时终止当前循环同时进入顶层循环的下一轮判断)

// 思路:获取没重复的最右一值放入新数组
function unique5(array){
 var r = [];
 for(var i = 0, l = array.length; i < l; i++) {
  for(var j = i + 1; j < l; j++)
   if (array[i] === array[j]) j = ++i;
  r.push(array[i]);
 }
 return r;
}

3.什么是变量提升(Variable Hoisting)?
这个问题稍微难一点,我也并不要求对方一定得回答出来。但是,通过这个问题能够快速确定应聘者的技术水平:他们是否真的像他们声明得那样理解这门编程语言?
变量提升指的是,无论是哪里的变量在一个范围内声明的,那么JavaScript引擎会将这个声明移到范围的顶部。如果在函数中间声明一个变量,例如在某一行中赋值一个变量:

function foo()
{
 // 此处省略若干代码
 var a = "abc";
}
实际上会这样运行代码:
function foo()
{
 var a;
 // 此处省略若干代码
 a = "abc";
}

4.全局变量有什么风险,以及如何保护代码不受干扰?
全局变量的危险之处在于其他人可以创建相同名称的变量,然后覆盖你正在使用的变量。这在任何语言中都是一个令人头疼的问题。
预防的方法也有很多。其中最常用的方法是创建一个包含其他所有变量的全局变量:
var applicationName = {};
然后,每当你需要创建一个全局变量的时候,将其附加到对象上即可。
applicationName.myVariable = "abc";
还有一种方法是将所有的代码封装到一个自动执行的函数中,这样一来,所有声明的变量都声明在该函数的范围内。

(function(){
 var a = "abc";
})();

在现实中,这两种方法你可能都会用到。
5.如何通过JavaScript对象中的成员变量迭代?

for(var prop in obj){
 // bonus points for hasOwnProperty
 if(obj.hasOwnProperty(prop)){
  // do something here
 }
}

6.什么是闭包(Closure)?
闭包允许一个函数定义在另一个外部函数的作用域内,即便作用域内的其他东西都消失了,它仍可以访问该外部函数内的变量。如果应聘者能够说明,在for/next循环中使用闭包却不声明变量来保存迭代变量当前值的一些风险,那就应该给对方加分。
7.请描述你经历过的JavaScript单元测试。
关于这个问题,其实我们只是想看看应聘人员是否真的做过JavaScript单元测试。这是一个开放式问题,没有特定的正确答案,不过对方至少得能讲述进程中的一些事情。

以上就是为大家准备的JavaScript面试题,有没有做的很顺利,希望大家在面试之前查漏补缺,顺利过关。

Javascript 相关文章推荐
Prototype Date对象 学习
Jul 12 Javascript
读jQuery之一(对象的组成)
Jun 11 Javascript
js汉字转拼音实现代码
Feb 06 Javascript
node.js中的console用法总结
Dec 15 Javascript
对Web开发中前端框架与前端类库的一些思考
Mar 27 Javascript
Windows系统下安装Node.js的步骤图文详解
Nov 15 Javascript
jQuery插件jquery.kxbdmarquee.js实现无缝滚动效果
Feb 15 Javascript
jQuery动态产生select option下拉列表
Mar 15 Javascript
node结合swig渲染摸板的方法
Apr 11 Javascript
微信开发之企业付款到银行卡接口开发的示例代码
Sep 18 Javascript
使用pm2自动化部署node项目的方法步骤
Jan 28 Javascript
JavaScript控制台的更多功能
Apr 28 Javascript
jQuery表格插件datatables用法详解
Nov 23 #Javascript
详解JavaScript UTC时间转换方法
Jan 07 #Javascript
jQuery formValidator表单验证
Jan 07 #Javascript
JavaScript中的原始值和复杂值
Jan 07 #Javascript
理解JS事件循环
Jan 07 #Javascript
angularjs创建弹出框实现拖动效果
Aug 25 #Javascript
JavaScript中定义类的方式详解
Jan 07 #Javascript
You might like
PHP MVC模式在网站架构中的实现分析
2010/03/04 PHP
使用PHP提取视频网站页面中的FLASH地址的代码
2010/04/17 PHP
Javascript简单实现可拖动的div
2013/10/22 Javascript
Jquery EasyUI中弹出确认对话框以及加载效果示例代码
2014/02/13 Javascript
jQuery控制的不同方向的滑动(向左、向右滑动等)
2014/07/18 Javascript
一个jquery实现的不错的多行文字图片滚动效果
2014/09/28 Javascript
jQuery通过控制节点实现仅在前台通过get方法完成参数传递
2015/02/02 Javascript
JavaScript截断字符串的方法
2015/07/15 Javascript
全面了解JavaScript的数据类型转换
2016/07/01 Javascript
JS获取随机数和时间转换的简单实例
2016/07/10 Javascript
简单模拟node.js中require的加载机制
2016/10/27 Javascript
JavaScript的六种继承方式(推荐)
2017/06/26 Javascript
微信小程序“摇一摇”的实例代码
2017/07/20 Javascript
微信小程序收藏功能的实现代码
2018/06/12 Javascript
Vue绑定内联样式问题
2018/10/17 Javascript
JavaScript前端页面搜索功能案例【基于jQuery】
2019/07/10 jQuery
微信用户访问小程序的登录过程详解
2019/09/20 Javascript
序列化模块json代码实例详解
2020/03/03 Javascript
python编写网页爬虫脚本并实现APScheduler调度
2014/07/28 Python
Python实现运行其他程序的四种方式实例分析
2017/08/17 Python
PyQt5的安装配置过程,将ui文件转为py文件后显示窗口的实例
2019/06/19 Python
Python安装并操作redis实现流程详解
2020/10/13 Python
关于PySnooper 永远不要使用print进行调试的问题
2021/03/04 Python
实例讲解CSS3中的box-flex弹性盒属性布局
2016/06/09 HTML / CSS
加拿大最大的体育用品、鞋类和服装零售商:Sport Chek
2018/11/29 全球购物
德国在线购买葡萄酒网站:Geile Weine
2019/09/24 全球购物
BannerBuzz加拿大:在线定制横幅印刷、广告和标志
2020/03/10 全球购物
SOA面试题:如何在SOA中实现松耦合
2013/07/21 面试题
专营店会计助理岗位职责
2013/11/29 职场文书
公务员培训心得体会
2013/12/28 职场文书
校园新闻广播稿
2014/01/10 职场文书
《钱学森》听课反思
2014/03/01 职场文书
2015年中学元旦晚会活动方案
2014/12/09 职场文书
Java基础之this关键字的使用
2021/06/30 Java/Android
canvas实现贪食蛇的实践
2022/02/15 Javascript
openstack云计算keystone组件工作介绍
2022/04/20 Servers