前端工程师有时候面试时会遇到一类面试官,他们问的问题对于语言本身非常较真儿,往往不是候选人可能期待的面向实际的问题(有些候选人强调能干活就行,至于知不知道其中缘由是无关痛痒的)。这类题目,虽然没有逻辑,但某种程度说,确实考察了候选人对于javascript这门语言的理解。

突然想到这个话题是无聊在翻自己的Github,看看以前都写过什么丑货。然后翻到了这篇解释Javascript quiz的文章quiz-legend,反正没事儿,就想搬过来供大家学习、理解、背诵、批判。

问题一

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

arguments是一个Array-like对象,对应的就是传入函数的参数列表。你可以在任何函数中直接使用该变量。

typeof操作符只会返回string类型的结果。参照如下列表可知对应不同数据,typeof返回的值都是什么:

类型 结果
undefined 'undefined'
null 'object'
Boolean 'boolean'
Number 'number'
String 'string'
Symbol (new in ECMAScript 2015) 'symbol'
Host object (provided by the JS environment) Implementation-dependent
Function object (implements [[Call]] in ECMA-262 terms) 'function'
Any other object 'object'

由此我们推断出,typeof argumentsobject

问题二

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);

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();//
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;//

with语句将某个对象添加的作用域链的顶部,如果在statement中有某個未使用命名空间的变量,跟作用域链中的某個属性同名,則這個变量将指向這個属性值。如果沒有同名的属性,则将拋出ReferenceError异常。

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

写在最后

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

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

转自:http://www.codeceo.com/article/14-javascript-interview-questions.html

14 个折磨人的 JavaScript 面试题的更多相关文章

  1. 互联网中级Javascript面试题

    互联网中级Javascript面试题 1.实现一个函数clone,可以对JavaScript中的5种主要的数据类型(包括Number.String.Object.Array.Boolean)进行值复制 ...

  2. 互联网公司前端初级Javascript面试题

    互联网公司前端初级Javascript面试题 1.JavaScript是一门什么样的语言,它有哪些特点?(简述javascript语言的特点)JavaScript是一种基于对象(Object)和事件驱 ...

  3. 174道 JavaScript 面试题,助你查漏补缺

    最近在整理 JavaScript 的时候发现遇到了很多面试中常见的面试题,本部分主要是作者在 Github 等各大论坛收录的 JavaScript 相关知识和一些相关面试题时所做的笔记,分享这份总结给 ...

  4. 你应该知道的25道Javascript面试题

    题目来自 25 Essential JavaScript Interview Questions.闲来无事,正好切一下. 一 What is a potential pitfall with usin ...

  5. (转载)7个去伪存真的JavaScript面试题

    7个去伪存真的JavaScript面试题 上周,我发表了<C#程序员的7个面试问题>.这次我要说的是如何淘汰那些滥竽充数的JavaScript程序员. 作者:小峰来源:码农网|2015-0 ...

  6. 一道 JavaScript 面试题

    有一道 JavaScript 面试题. f = function () { return true; }; g = function () { return false; }; (function() ...

  7. 人人网javascript面试题

    JavaScript面试题要求:以下题目必须从一至四题中,选出三道题,使用原生代码实现,不可使用任何框架,第五题为选作题. 一.  在页面的固定区域内实现图片的展示       <ignore_ ...

  8. 【转】典型的JavaScript面试题

    问题1: 作用域(Scope) (function() { "use strict"; var a = b = 5; })(); console.log(b); 控制台(conso ...

  9. 5个经典的JavaScript面试题

    在IT界中公司对JavaScript开发者的要求还是比较高的,但是如果JavaScript开 发者的技能和经验都达到了一定的级别,那他们还是很容易跳到优秀的公司的,当然薪水就更不是问题了.但是在面试之 ...

随机推荐

  1. Javascript 原型编程初探

    创建两个对象独立运行 var PlayTrace = function (interVal,name) { this.interVal = interVal; this.playName = name ...

  2. SCI期刊的审稿流程

    审稿中涉及到的人: EIC-Editor in Chief 主编, 此人很重要,有稿件最终决定权. ADM- (可能是) Administrator 应该是协助主编日常工作的. AE-Associat ...

  3. using inno setup uninstall default icon

    If you set SetupIconFile then the Uninstall Exe File (e.g. unins000.exe) will have exactly same icon ...

  4. ios7 Cocos2dx 隐藏状态栏设置

    环境: cocos2d-x 2.1.5 ios7.0     在info.plist 添加 UIViewControllerBasedStatusBarAppearance(View controll ...

  5. SQLSERVER的兼容级别

    今天采用SQL Mannager 2008连接远程的sqlserver数据库,之后弹出一个对话框,修改SQL兼容级别,当时每太注意,一下点击了确定按钮,结果导致两个系统SQL只想全部出错,幸亏发现的早 ...

  6. Spring的java.lang.IndexOutOfBoundsException: Remember that ordinal parameters are 1-based!异常处理方法

    使用Spring提供的模板类HibernateDaoSupport,如果单纯的使用'命名参数'的形式编写HQL语句如: public class UserDaoImpl extends Hiberna ...

  7. JNI_Android项目中调用.so动态库实现详解【转】

    转自 http://www.cnblogs.com/sevenyuan/p/4202759.html 1. 在Eclipse中创建项目:TestJNI 2. 新创建一个class:TestJNI.ja ...

  8. ASP.NET5 中静态文件的各种使用方式

    所谓静态文件,包含HTML文件,css文件.图片文件和js文件等,他们是服务器直接读取到客户端的一些资源,在这篇文章中,我们将解释关于ASP.NET5和静态文件的一些内容. 服务端的静态文件 默认情况 ...

  9. 仿qq空间相册的图片批量上传

    效果: 转载请注明:http://www.cnblogs.com/TheViper/ 主要是flash组件的tilelist,这个很有用.还有对flash组件源码的一点修改hack. 还是代码很简单, ...

  10. COM 学习(五)——编译、注册、调用

    "最小依赖",表示编译器会把 ATL 中必须使用的一些函数静态连接到目标程序中.这样目标文件尺寸会稍大,但独立性更强,安装方便:反之系统执行的时候需要有 ATL.DLL 文件的支持 ...