14 个折磨人的 JavaScript 面试题


Posted in Javascript onAugust 08, 2016

翻到了这篇解释Javascript quiz的文章quiz-legend,反正没事儿,就想搬过来供大家学习、理解、背诵、批判。

问题一

(function(){
 return typeof arguments;//"object"
})();

arguments是一个Array-like对象,对应的就是传入函数的参数列表。你可以在任何函数中直接使用该变量。
typeof操作符只会返回string类型的结果。参照如下列表可知对应不同数据,typeof返回的值都是什么:

14 个折磨人的 JavaScript 面试题

由此我们推断出,typeof arguments是object 

问题二

var f = function g(){ return 23; };
typeof g();//报错

这是一个名字是g的function expression,然后又被赋值给了变量f。
 这里的函数名g和被其赋值的变量f有如下差异:
 函数名g不能变动,而变量f可以被重新赋值
 函数名g只能在函数体内部被使用,试图在函数外部使用g会报错的 

问题三

(function(x){
 delete x;
 return x;//1
})(1);

delete操作符可以从对象中删除属性,正确用法如下:
delete object.property
delete object['property']
delete操作符只能作用在对象的属性上,对变量和函数名无效。也就是说delete x是没有意义的。 

你最好也知道,delete是不会直接释放内存的,她只是间接的中断对象引用 

问题四
var y = 1, x = y = typeof x; x;//"undefined"
我们试图分解上述代码成下面两步:
var y = 1; //step 1
var x = y = typeof x; //step 2
第一步应该没有异议,我们直接看第二步
 1.赋值表达式从右向左执行
 2.y被重新赋值为typeof x的结果,也就是undefined
 3.x被赋值为右边表达式(y = typeof x)的结果,也就是undefined 

问题五

(function f(f){
 return typeof f();//"number"
})(function(){ return 1; });

直接上注释解释:

(function f(f){
 //这里的f是传入的参数function(){ return 1; }
 //执行的结果自然是1
 return typeof f(); //所以根据问题一的表格我们知道,typeof 1结果是"number"
})(function(){ return 1; });

问题六

var foo = {
 bar: function() { return this.baz; },
 baz: 1
};

(function(){
 return typeof arguments[0]();//"undefined"
})(foo.bar);

这里你可能会误以为最终结果是number。向函数中传递参数可以看作是一种赋值,所以arguments[0]得到是是真正的bar函数的值,而不是foo.bar这个引用,那么自然this也就不会指向foo,而是window了。 

问题七

var foo = {
 bar: function(){ return this.baz; },
 baz: 1
}
typeof (f = foo.bar)();//"undefined"

这和上一题是一样的问题,(f = foo.bar)返回的就是bar的值,而不是其引用,那么this也就指的不是foo了。 

问题八 

var f = (function f(){ return '1'; }, function g(){ return 2; })();
typeof f;//"number"

逗号操作符 对它的每个操作对象求值(从左至右),然后返回最后一个操作对象的值 

所以(function f(){ return '1'; }, function g(){ return 2; })的返回值就是函数g,然后执行她,那么结果是2;最后再typeof 2,根据问题一的表格,结果自然是number 

问题九

var x = 1;
if (function f(){}) {
 x += typeof f;
}
x;//"1undefined"

这个问题的关键点,我们在问题二中谈到过,function expression中的函数名f是不能在函数体外部访问的

问题十

var x = [typeof x, typeof y][1];
typeof typeof x;//"string" 1.因为没有声明过变量y,所以typeof y返回"undefined"

 2.将typeof y的结果赋值给x,也就是说x现在是"undefined"
 3.然后typeof x当然是"string"
 4.最后typeof "string"的结果自然还是"string" 

问题十一 

(function(foo){
 return typeof foo.bar;//"undefined"
})({ foo: { bar: 1 } });

这是个纯粹的视觉诡计,上注释

(function(foo){

 //这里的foo,是{ foo: { bar: 1 } },并没有bar属性哦。
 //bar属性是在foo.foo下面
 //所以这里结果是"undefined"
 return typeof foo.bar;
})({ foo: { bar: 1 } });

问题十二

(function f(){
 function f(){ return 1; }
 return f();//2
 function f(){ return 2; }
})();

通过function declaration声明的函数甚至可以在声明之前使用,这种特性我们称之为hoisting。于是上述代码其实是这样被运行环境解释的:

(function f(){
 function f(){ return 1; }
 function f(){ return 2; }
 return f();
})();

问题十三

function f(){ return f; }
new f() instanceof f;//false

当代码new f()执行时,下面事情将会发生:
 1.一个新对象被创建。它继承自f.prototype
 2.构造函数f被执行。执行的时候,相应的传参会被传入,同时上下文(this)会被指定为这个新实例。new f等同于new f(),只能用在不传递任何参数的情况。
 3.如果构造函数返回了一个“对象”,那么这个对象会取代整个new出来的结果。如果构造函数没有返回对象,那么new出来的结果为步骤1创建的对象, 

ps:一般情况下构造函数不返回任何值,不过用户如果想覆盖这个返回值,可以自己选择返回一个普通对象来覆盖。当然,返回数组也会覆盖,因为数组也是对象。 

于是,我们这里的new f()返回的仍然是函数f本身,而并非他的实例 

问题十四
 with (function(x, undefined){}) length;//2
with语句将某个对象添加的作用域链的顶部,如果在statement中有某??未使用命名空间的变量,跟作用域链中的某??属性同名,?t???变量将指向???属性值。如果?]有同名的属性,则将??出ReferenceError异常。 

OK,现在我们来看,由于function(x, undefined){}是一个匿名函数表达式,是函数,就会有length属性,指的就是函数的参数个数。所以最终结果就是2了 

写在最后

有人觉得这些题坑爹,也有人觉得开阔了眼界,见仁见智吧。但有一件事是真的,无论你是否坚定的实践派,缺了理论基础,也铁定走不远 - 你永远不会见到哪个熟练的技术工人突然成了火箭专家。 

看文档、读标准、结合实践,才是同志们的决胜之道。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery 遍历json数组的实现代码
Sep 22 Javascript
更靠谱的H5横竖屏检测方法(js代码)
Sep 13 Javascript
jQGrid动态填充select下拉框的选项值(动态填充)
Nov 28 Javascript
Reactjs实现通用分页组件的实例代码
Jan 19 Javascript
微信小程序 动态绑定数据及动态事件处理
Mar 14 Javascript
Angular将填入表单的数据渲染到表格的方法
Sep 22 Javascript
jQuery 防止相同的事件快速重复触发方法
Feb 08 jQuery
浅谈angular4.0中路由传递参数、获取参数最nice的写法
Mar 12 Javascript
详解组件库的webpack构建速度优化
Jun 18 Javascript
基于js Canvas实现二次贝塞尔曲线
Dec 25 Javascript
详解基于element的区间选择组件校验(交易金额)
Jan 07 Javascript
36个正则表达式(开发效率提高80%)
Nov 17 Javascript
js中 计算两个日期间的工作日的简单实例
Aug 08 #Javascript
WebSocket+node.js创建即时通信的Web聊天服务器
Aug 08 #Javascript
学习Javascript闭包(Closure)知识
Aug 07 #Javascript
JavaScript实现in-place思想的快速排序方法
Aug 07 #Javascript
使用jQuery调用XML实现无刷新即时聊天
Aug 07 #Javascript
JS中使用FormData上传文件、图片的方法
Aug 07 #Javascript
深入理解Angular2 模板语法
Aug 07 #Javascript
You might like
PHP字符串长度计算 - strlen()函数使用介绍
2013/10/15 PHP
php代码架构的八点注意事项
2016/01/25 PHP
Symfony核心类概述
2016/03/17 PHP
Laravel SQL语句记录方式(推荐)
2016/05/26 PHP
用PHP做了一个领取优惠券活动的示例代码
2019/07/05 PHP
用Juery网页选项卡实现代码
2011/06/13 Javascript
详解JavaScript的策略模式编程
2015/06/24 Javascript
js实现仿爱微网两级导航菜单效果代码
2015/08/31 Javascript
基于JavaScript实现表单密码的隐藏和显示出来
2016/03/02 Javascript
第七章之菜单按钮图标组件
2016/04/25 Javascript
利用vue写todolist单页应用
2016/12/15 Javascript
JS开发中百度地图+城市联动实现实时触发查询地址功能
2017/04/13 Javascript
nodejs之get/post请求的几种方式小结
2017/07/26 NodeJs
浅谈webpack 构建性能优化策略小结
2018/06/13 Javascript
JS动态图片的实现方法完整示例
2020/01/13 Javascript
[02:20]DOTA2中文配音宣传片
2013/05/22 DOTA
[05:28]刀塔密之一:团结则存
2014/07/03 DOTA
[37:35]DOTA2上海特级锦标赛A组资格赛#1 Secret VS MVP.Phx第二局
2016/02/25 DOTA
解决import tensorflow as tf 出错的原因
2020/04/16 Python
基于 Python 实践感知器分类算法
2021/01/07 Python
小橄榄树:Le Petit Olivier
2018/04/23 全球购物
享受加州生活方式的时尚舒适:XCVI
2018/07/09 全球购物
Cynthia Rowley官网:全球领先的生活方式品牌
2020/10/27 全球购物
C语言编程练习
2012/04/02 面试题
过程装备与控制工程专业个人的求职信
2013/12/01 职场文书
求职简历推荐信范文
2013/12/02 职场文书
经贸日语专业个人求职信范文
2013/12/28 职场文书
开工庆典邀请函范文
2014/01/16 职场文书
广告宣传策划方案
2014/05/21 职场文书
会计学习心得体会
2014/09/09 职场文书
王兆力在市委党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
酒店前台辞职书
2015/02/26 职场文书
借钱欠条怎么写
2015/07/03 职场文书
Python-typing: 类型标注与支持 Any类型详解
2021/05/10 Python
MySql存储过程之逻辑判断和条件控制
2021/05/26 MySQL
缓存替换策略及应用(以Redis、InnoDB为例)
2021/07/25 Redis