5个典型的JavaScript面试题
2016-02-19 15:10
501 查看
阅读目录
1. 变量范围
2. 创建“native”方法
3. 提升 Hoisting
4.this在JavaScript中是如何工作的
5.call()和apply()
JavaScript是一门有意思的语言,入门很快,但是想要深入的理解却并不简单,比如JavaScript中的原型、面向对象。对当前的Web世界而言,JavaScript是一门你必须精通的语言,因此本文借用一些面试题来回顾一下JavaScript中的典型知识点。
以下代码的输出结果为:
?
解答:
在这个立即执行函数表达式(IIFE)中包括两个赋值操作,其中a使用var关键字进行声明,因此其属于函数内部的局部变量(仅存在于函数中),相反,b被分配到全局命名空间。
另一个需要注意的是,这里没有在函数内部使用严格模式(use strict;)。如果启用了严格模式,代码会在输出b时报错Uncaught ReferenceError:
b is not defined,需要记住的是,严格模式要求你显式的引用全局作用域。因此,你需要写成:
?
在String对象上定义一个repeatify方法。该方法接收一个整数作为参数用于指定字符串的重复次数。例如:
?
解答:
?
这个题目主要测试你对JavaScript中的继承和prototype属性的理解。另一个值得关注的点是,在定义该方法前你需要确定该对象中是否已存在你要定义的同名方法。通常,我们使用如下的方式:
?
以下代码的执行结果为:
?
回答:
执行结果分别为undefined和2。
在JavaScript中,变量和命名函数都会被提升到函数的顶端,但是对变量而言其初始化操作不会被提升。因此,当打印a的值时,它虽然存在于函数test()中,但其值此刻为undefined,即未被初始化。也就是说,上面的代码会被转换成:
?
下面代码的执行结果为:
?
解答:
上面的代码打印结果依次为Aurelio De Rosa和John Doe。 原因在于this指向的是函数的执行环境,this取决于其被谁调用了,而不是被谁定义了。
对第一个console.log()语句而言,getFullName()是作为obj.prop对象的一个方法被调用的,因此此时的执行环境应该是这个对象。另一方面,但getFullName()被分配给test变量时,此时的执行环境变成全局对象(window),原因是test是在全局作用域中定义的。因此,此时的this指向的是全局作用域的fullname变量,即John Doe。
修正题目4中存在的问题,使得最后一个console.log()打印出Aurelio De Rosa。
解答:
可以使用call()或者apply()强制切换执行环境,如果你不知道这两者的区别,可以参考这篇文章。如下:
?
无论是jQuery,还是当前热门的AngularJS和ReactJS,都离不开扎实的JavaScript的基础。2015年有很多值得你学习的JavaScript知识,如ECMAScript6, TypeScript等等,但这一切之前,你一定要看的书肯定应该包括下面几本:
JavaScript高级程序设计,第三版,Nicholas.C.Zakas
JavaScript权威指南,第五版,犀牛书
JavaScript语言精粹,修订版,蝴蝶书
1. 变量范围
2. 创建“native”方法
3. 提升 Hoisting
4.this在JavaScript中是如何工作的
5.call()和apply()
JavaScript是一门有意思的语言,入门很快,但是想要深入的理解却并不简单,比如JavaScript中的原型、面向对象。对当前的Web世界而言,JavaScript是一门你必须精通的语言,因此本文借用一些面试题来回顾一下JavaScript中的典型知识点。
面试题
1. 变量范围
以下代码的输出结果为:?
在这个立即执行函数表达式(IIFE)中包括两个赋值操作,其中a使用var关键字进行声明,因此其属于函数内部的局部变量(仅存在于函数中),相反,b被分配到全局命名空间。
另一个需要注意的是,这里没有在函数内部使用严格模式(use strict;)。如果启用了严格模式,代码会在输出b时报错Uncaught ReferenceError:
b is not defined,需要记住的是,严格模式要求你显式的引用全局作用域。因此,你需要写成:
?
2. 创建“native”方法
在String对象上定义一个repeatify方法。该方法接收一个整数作为参数用于指定字符串的重复次数。例如:?
?
?
3. 提升 Hoisting
以下代码的执行结果为:?
执行结果分别为undefined和2。
在JavaScript中,变量和命名函数都会被提升到函数的顶端,但是对变量而言其初始化操作不会被提升。因此,当打印a的值时,它虽然存在于函数test()中,但其值此刻为undefined,即未被初始化。也就是说,上面的代码会被转换成:
?
4.this在JavaScript中是如何工作的
下面代码的执行结果为:?
上面的代码打印结果依次为Aurelio De Rosa和John Doe。 原因在于this指向的是函数的执行环境,this取决于其被谁调用了,而不是被谁定义了。
对第一个console.log()语句而言,getFullName()是作为obj.prop对象的一个方法被调用的,因此此时的执行环境应该是这个对象。另一方面,但getFullName()被分配给test变量时,此时的执行环境变成全局对象(window),原因是test是在全局作用域中定义的。因此,此时的this指向的是全局作用域的fullname变量,即John Doe。
5.call()和apply()
修正题目4中存在的问题,使得最后一个console.log()打印出Aurelio De Rosa。解答:
可以使用call()或者apply()强制切换执行环境,如果你不知道这两者的区别,可以参考这篇文章。如下:
?
JavaScript学习建议
阅读列表
无论是jQuery,还是当前热门的AngularJS和ReactJS,都离不开扎实的JavaScript的基础。2015年有很多值得你学习的JavaScript知识,如ECMAScript6, TypeScript等等,但这一切之前,你一定要看的书肯定应该包括下面几本:JavaScript高级程序设计,第三版,Nicholas.C.Zakas
JavaScript权威指南,第五版,犀牛书
JavaScript语言精粹,修订版,蝴蝶书
相关文章推荐
- 最流行的前端框架、库、JavaScript模板引擎
- js中判断 NaN,undefined,null和转数字,正则去除千分号等
- 点击操作实现表格多选的js
- 关于java和javascript交互中的日期处理问题汇总
- javascript Array.map 源码解读
- 从零开始写一款javascript插件(一)——tab选项卡
- js性能-DOM编程之重绘和重排
- 双击锁定,单击排序的js实现
- 史上最全javascript parseInt函数详解
- jsp文件中charset和pageEncoding的区别
- js刷新当前页面
- 归纳下js面向对象的几种常见写法
- js动画(4)——多物体运动
- Javascript中的循环变量声明,到底应该放在哪儿?
- json
- JS Window
- JSTL EL 详解
- 关于URL编码/javascript/js url 编码/url的三个js编码函数
- javascript实现选项卡切换效果
- 柯里化函数之Javascript