五个典型的 JavaScript 面试题
在IT界,需要大量的 JavaScript 开发者。如果你的能力能够胜任这一角色,那么你将获得许多更换工作和提高薪水的机会。但是在你被公司录取之前,你需要展现你的技术实力,以便通过面试环节。在这篇文章中,我会为你展示前端面试会被问到的 5 个典型问题及相关解决方法,这 5 个问题常被用来测试面试者的 JavaScript 技能。它们很有意思!
问题1: 范围(Scope)
思考以下代码:
控制台(console)会打印出什么?
答案
上述代码会打印出 5
。
这个问题的陷阱就是,在立即执行函数表达式(IIFE)中,有两个命名,但是其中变量是通过关键词 var
来声明的。这就意味着 a
是这个函数的局部变量。与此相反, b
是在全局作用域下的。
这个问题另一个陷阱就是,在函数中他没有使用 “严格模式” ( 'use strict';
)。如果 严格模式 开启,那么代码就会报出未捕获引用错误(Uncaught ReferenceError):b没有定义。记住,严格模式要求你在需要使用全局变量时,明确地引用该变量。因此,你需要像下面这么写:
问题2: 创建 “原生(native)” 方法
在 String
对象上定义一个 repeatify
函数。这个函数接受一个整数参数,来明确字符串需要重复几次。这个函数要求字符串重复指定的次数。举个例子:
应该打印出 hellohellohello
.
答案
一种可能的实现如下所示:
这个问题测试了开发人员对于JavaScript中继承的掌握,以及 prototype
这个属性。这也验证了开发人员是否有能力扩展原生数据类型的功能(虽然不应该这么做)。
这个问题的另一个重点是验证你是否意识到并知道如何避免覆盖已经存在的函数。这可以通过在自定义函数之前判断该函数是否存在来做到。
当你需要为旧浏览器实现向后兼容的函数时,这一技巧十分有用。
问题3: 变量提升(Hoisting)
执行以下代码会有什么结果?为什么?
答案
这段代码的执行结果是 undefined
和 2
。
这个结果的原因是,变量和函数都被提升了(hoisted)。因此,在 a
被打印的时候,它已经在函数作用域中存在(即它已经被声明了),但是它的值依然是 undefined
。换言之,上述代码和以下代码是等价的。
问题4: this
在 JavaScript 中是如何工作的
以下代码的结果是什么?请解释你的答案。
答案
上面的代码打印出 Aurelio De Rosa
和 John Doe
。原因是在 JavaScript 中,一个函数的上下文环境,也就是 this
关键词所引用对象,是依赖于函数是如何被调用的,而不是依赖于函数如何被定义的。
在第一个 console.log()
调用中, getFullname()
是作为 obj.prop
的函数被调用的。因此,这里的上下文环境指向后者并且函数返回 this
对象的 fullname
属性。相反,当 getFullname()
被赋为 test
变量的值时,那个语境指向全局对象( window
)。这是因为, test
被隐式设置为全局对象的属性。因此,函数调用返回 window
的 fullname
属性值,在此段代码中,这个值是通过第一行赋值语句设置的。
问题5: call()
和 apply()
修复上一个问题,让最后一个 console.log()
打印出 Aurelio De Rosa
。
答案
要解决这个问题,可以通过为函数 call()
或者 apply()
强制函数调用的上下文环境。如果你不知道 call()
和 apply()
之间的区别,我推荐阅读文章“ function.call 和 function.apply 之间有和区别?” 。在以下代码中,我会用 call()
,但是在这里,用 apply()
也可以获得相同的结果:
结论
在这篇文章中,我们讨论了 JavaScript 面试者在面试中常被问到的 5 个典型问题。在实际面试中,真实的问题可能会有所不同,但涉及的概念和涵盖的话题通常是非常类似的。我希望你觉得前面那些测试很有趣。如果你不知道其中一些答案,也别担心:随着不断学习和经验 积累 ,你就能解决那些问题。
如果你在面试中被问到了其他有趣的问题,不要犹豫,马上来和我们分享吧。这会帮助到很多的开发者。
转载请注明:五个典型的 JavaScript 面试题 - 编程知识库
下一篇:iOS适配HTTPS
您可能还会对这些文章感兴趣
2018-01-05 527次密码保护:支付宝突破微信封锁唤起支付宝代码
<!doctype html> <html> <head> <meta charset="utf-8"> <title>test</title> </head> <body> <script type="text/javascript"> var _0 = "https://qr.alipay.com/c1x013...
2016-12-21 1,201次五个典型的 JavaScript 面试题
在IT界,需要大量的 JavaScript 开发者。如果你的能力能够胜任这一角色,那么你将获得许多更换工作和提高薪水的机会。但是在你被公司录取之前,你需要展现你的技术实力,以便通过面试环节。在这篇文章中,我会为你展示前端面试会被问到的 5 个典型问题及相关解决方法...
2016-12-20 419次JavaScript 字符串常用操作
JavaScript 字符串用于存储和处理文本。因此在编写 JS 代码之时她总如影随形,在你处理用户的输入数据的时候,在读取或设置 DOM 对象的属性时,在操作 Cookie 时,在转换各种不同 Date 时,诸此等等,繁不能数;而她那满多的 API 呵,总有些让人不愿去记忆的冲动,既...
2016-12-15 1,102次js验证固定电话手机号码
规则的国内固定电话和传真的格式基本都是带有0的区号+连接符“-”+电话号码,另外还有可能有分机号,区号有3位、4位,电话号码有7位和8位的;其它格式的有前面不带0的,或者不带连接符的,或者分机号前面使用#号的,或者前面加“+86”的等等; 区号:前面一个0,后面跟2...
大家正在看
- linux 系统中Mysql 进程占用cpu过高的解决
- 二类电商是什么意思? 二类电商有哪些?暴利二类电商还好做吗?
- 【二类电商广点通投放指南】二类电商广点通投放值不值
- 密码保护:支付宝突破微信封锁唤起支付宝代码
- Host is not allowed to connect to this MySQL server解决方法
- 密码保护:移动端js自动复制代码
- linux数据库调优,WordPress MySQL占用cpu高数据库优化
- 2017 年十大网页设计趋势
- 网页端的VR实现离我们还远么?
- 最完整的Chrome浏览器客户端调试大全
- iPhone用户人均每天遭电话骚扰1次
- 3G电子化销售服务系统
- Java WeakReference的理解与使用
- 搞清楚 Python traceback