全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

10道典型的JavaScript面试题

问题1: 作用域(Scope)

考虑以下代码:

(function() {
 var a = b = 5;
})();
console.log(b);

控制台(console)会打印出什么?

答案:5

如果 严格模式开启,那么代码就会报错 ” Uncaught ReferenceError: b is not defined” 。请记住,如果这是预期的行为,严格模式要求你显式地引用全局作用域。所以,你需要像下面这么写:

(function() {
 'use strict';
 var a = window.b = 5;
})();
console.log(b);

问题2: 创建 “原生(native)” 方法

在 String 对象上定义一个 repeatify 函数。这个函数接受一个整数参数,来明确字符串需要重复几次。这个函数要求字符串重复指定的次数。举个例子:

console.log('hello'.repeatify(3));

应该打印出hellohellohello.

答案:

String.prototype.repeatify = String.prototype.repeatify || function(times) {
 var str = '';
 for (var i = 0; i < times; i++) {
  str += this;
 }
 return str;
};

在这里,另一个关键点是,看你怎样避免重写可能已经定义了的方法。这可以通过在定义自己的方法之前,检测方法是否已经存在。

String.prototype.repeatify = String.prototype.repeatify || function(times) {/* code here */};

问题3: 变量提升(Hoisting)

执行以下代码的结果是什么?为什么?

function test() {
 console.log(a);
 console.log(foo());
 var a = 1;
 function foo() {
  return 2;
 }
}
test();

答案:

这段代码的执行结果是undefined 和 2。

这个结果的原因是,变量和函数都被提升(hoisted) 到了函数体的顶部。因此,当打印变量a时,它虽存在于函数体(因为a已经被声明),但仍然是undefined。换言之,上面的代码等同于下面的代码:

function test() {
 var a;
 function foo() {
  return 2;
 }
 console.log(a);
 console.log(foo());
 a = 1;
} 
test();

问题4: 在javascript中,`this`是如何工作的

以下代码的结果是什么?请解释你的答案。

var fullname = 'John Doe';
var obj = {
 fullname: 'Colin Ihrig',
 prop: {
  fullname: 'Aurelio De Rosa',
  getFullname: function() {
   return this.fullname;
  }
 }
};
console.log(obj.prop.getFullname());
var test = obj.prop.getFullname;
console.log(test());

答案:

这段代码打印结果是:Aurelio De Rosa 和 John Doe 。原因是,JavaScript中关键字this所引用的是函数上下文,取决于函数是如何调用的,而不是怎么被定义的。

在第一个console.log(),getFullname()是作为obj.prop对象的函数被调用。因此,当前的上下文指代后者,并且函数返回这个对象的fullname属性。相反,当getFullname()被赋值给test变量时,当前的上下文是全局对象window,这是因为test被隐式地作为全局对象的属性。基于这一点,函数返回window的fullname,在本例中即为第一行代码设置的。

问题5: call() 和 apply()

修复前一个问题,让最后一个console.log() 打印输出Aurelio De Rosa.

答案:

这个问题可以通过运用call()或者apply()方法强制转换上下文环境。

console.log(test.call(obj.prop));

问题6: 闭包(Closures)

考虑下面的代码:

var nodes = document.getElementsByTagName('button');
for (var i = 0; i < nodes.length; i++) {
 nodes[i].addEventListener('click', function() {
  console.log('You clicked element #' + i);
 });
}

请问,如果用户点击第一个和第四个按钮的时候,控制台分别打印的结果是什么?为什么?

答案:

两次打印都是nodes.length的值。

问题7: 闭包(Closures)

修复上题的问题,使得点击第一个按钮时输出0,点击第二个按钮时输出1,依此类推。

答案:

有多种办法可以解决这个问题,下面主要使用两种方法解决这个问题。

第一个解决方案使用立即执行函数表达式(IIFE)再创建一个闭包,从而得到所期望的i的值。实现此方法的代码如下:

var nodes = document.getElementsByTagName('button');
for (var i = 0; i < nodes.length; i++) {
 nodes[i].addEventListener('click', (function(i) {
  return function() {
   console.log('You clicked element #' + i);
  }
 })(i));
}

另一个解决方案不使用IIFE,而是将函数移到循环的外面。这种方法由下面的代码实现:

function handlerWrapper(i) {
 return function() {
  console.log('You clicked element #' + i);
 }
}
var nodes = document.getElementsByTagName('button');
for (var i = 0; i < nodes.length; i++) {
 nodes[i].addEventListener('click', handlerWrapper(i));
}

问题8:数据类型

考虑如下代码:

console.log(typeof null);
console.log(typeof {});
console.log(typeof []);
console.log(typeof undefined);

答案:

object
object
object
undefined

问题9:事件循环

下面代码运行结果是什么?请解释。

function printing() {
 console.log(1);
 setTimeout(function() { console.log(2); }, 1000);
 setTimeout(function() { console.log(3); }, 0);
 console.log(4);
}
printing();

答案:

1
4
3
2

想知道为什么输出顺序是这样的,你需要弄了解setTimeout()做了什么,以及浏览器的事件循环原理。浏览器有一个事件循环用于检查事件队列,处理延迟的事件。UI事件(例如,点击,滚动等),Ajax回调,以及提供给setTimeout()和setInterval()的回调都会依次被事件循环处理。因此,当调用setTimeout()函数时,即使延迟的时间被设置为0,提供的回调也会被排队。回调会呆在队列中,直到指定的时间用完后,引擎开始执行动作(如果它在当前不执行其他的动作)。因此,即使setTimeout()回调被延迟0毫秒,它仍然会被排队,并且直到函数中其他非延迟的语句被执行完了之后,才会执行。

问题10:算法

写一个isPrime()函数,当其为质数时返回true,否则返回false。

答案:

我认为这是面试中最常见的问题之一。然而,尽管这个问题经常出现并且也很简单,但是从被面试人提供的答案中能很好地看出被面试人的数学和算法水平。

首先, 因为JavaScript不同于C或者Java,因此你不能信任传递来的数据类型。如果面试官没有明确地告诉你,你应该询问他是否需要做输入检查,还是不进行检查直接写函数。严格上说,应该对函数的输入进行检查。

第二点要记住:负数不是质数。同样的,1和0也不是,因此,首先测试这些数字。此外,2是质数中唯一的偶数。没有必要用一个循环来验证4,6,8。再则,如果一个数字不能被2整除,那么它不能被4,6,8等整除。因此,你的循环必须跳过这些数字。如果你测试输入偶数,你的算法将慢2倍(你测试双倍数字)。可以采取其他一些更明智的优化手段,我这里采用的是适用于大多数情况的。例如,如果一个数字不能被5整除,它也不会被5的倍数整除。所以,没有必要检测10,15,20等等。

最后一点,你不需要检查比输入数字的开方还要大的数字。我感觉人们会遗漏掉这一点,并且也不会因为此而获得消极的反馈。但是,展示出这一方面的知识会给你额外加分。

现在你具备了这个问题的背景知识,下面是总结以上所有考虑的解决方案:

function isPrime(number) {
 // If your browser doesn't support the method Number.isInteger of ECMAScript 6,
 // you can implement your own pretty easily
 if (typeof number !== 'number' || !Number.isInteger(number)) {
  // Alternatively you can throw an error.
  return false;
 }
 if (number < 2) {
  return false;
 }
 if (number === 2) {
  return true;
 } else if (number % 2 === 0) {
  return false;
 }
 var squareRoot = Math.sqrt(number);
 for(var i = 3; i <= squareRoot; i += 2) {
  if (number % i === 0) {
   return false;
  }
 }
 return true;
}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


# js  # 面试题  # 13道关于JavaScript正则表达式的面试题  # 详解JS中的this、apply、call、bind(经典面试题)  # 关于javascript作用域的常见面试题分享  # 面试常见的js算法题  # 80%应聘者都不及格的JS面试题  # Javascript前端经典的面试题及答案  # JavaScript中最常见的三个面试题解析  # 一篇文章搞定JavaScript类型转换(面试常见)  # 总结几道关于Node.js的面试问题  # 「中高级前端面试」JavaScript手写代码无敌秘籍(推荐)  # 第一个  # 回调  # 这个问题  # 的是  # 这是  # 这段  # 解决这个问题  # 自己的  # 都是  # 这一  # 就会  # 如果你  # 加分  # 在这里  # 很好  # 给你  # 也会  # 结果是  # 是这样  # 依此类推 


相关文章: 制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?  如何通过智能用户系统一键生成高效建站方案?  C++中引用和指针有什么区别?(代码说明)  建站之家VIP精选网站模板与SEO优化教程整合指南  网站制作公司排行榜,四大门户网站排名?  成都网站制作报价公司,成都工业用气开户费用?  建站ABC备案流程中有哪些关键注意事项?  如何在Windows环境下新建FTP站点并设置权限?  建站主机选哪种环境更利于SEO优化?  宝盒自助建站智能生成技巧:SEO优化与关键词设置指南  网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?  如何在橙子建站中快速调整背景颜色?  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  建站主机功能解析:服务器选择与快速搭建指南  ,在苏州找工作,上哪个网站比较好?  如何配置支付宝与微信支付功能?  导航网站建站方案与优化指南:一站式高效搭建技巧解析  内网网站制作软件,内网的网站如何发布到外网?  家具网站制作软件,家具厂怎么跑业务?  香港服务器建站指南:免备案优势与SEO优化技巧全解析  如何用PHP快速搭建CMS系统?  官网建站费用明细查询_企业建站套餐价格及收费标准指南  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  网站制作的步骤包括,正确网址格式怎么写?  高端建站如何打造兼具美学与转化的品牌官网?  建站之星北京办公室:智能建站系统与小程序生成方案解析  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  如何通过网站建站时间优化SEO与用户体验?  c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗  建站之星安装后如何自定义网站颜色与字体?  如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法  早安海报制作网站推荐大全,企业早安海报怎么每天更换?  如何用AWS免费套餐快速搭建高效网站?  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  建站之星与建站宝盒如何选择最佳方案?  制作网站的过程怎么写,用凡科建站如何制作自己的网站?    Android滚轮选择时间控件使用详解  大连 网站制作,大连天途有线官网?  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  建站之星CMS建站配置指南:模板选择与SEO优化技巧  建站上传速度慢?如何优化加速网站加载效率?  浅析上传头像示例及其注意事项  郑州企业网站制作公司,郑州招聘网站有哪些?  常州自助建站:操作简便模板丰富,企业个人快速搭建网站  建站之星后台管理:高效配置与模板优化提升用户体验  制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。