JS经典笔试题

作者: 公子七 | 来源:发表于2017-08-18 20:38 被阅读476次

原文来自知乎:求职 | 听说集齐了这些Js题,笔试都不怕了呢!,读完以后累觉不爱,过几天还有面试,我真是越挫越勇了=-=
总之,看的不是很懂,云里雾里,就没有写题解,蓝瘦。
请给一个在前端路上苦苦挣扎的程序媛新手打打气。。。

1 写在前面

一套JavaScript题目

前端工程师是互联网时代软件产品研发中不可缺少的一种专业研发角色。以前看过一套JavaScript题目,借花献佛拿出来分享一下,附带了自己的理解和答案。有争议的地方,欢迎大家指出和讨论。
下面可以前端笔试中的典型“坑”呢,快来看看吧!

2 题目详情

2.1 题目一

(function() { 
  return typeof arguments; 
})();

答案:“object”
arguments是对象,伪数组有两件事要注意这里:
参数不是数组,它是一个数组一样的物体,你可以使用方括号和整数索引的元素,但方法通常可在一个如推上不存在参数数组
Array.prototype.slice.call(arguments); 转成数组,当然arguments即使是数组,返回的依然是”object”,因为数组也是对象。

附加
typeof 对类型的判断
https://developer.mozilla.org/zh-CN/docs/JavaScript/Reference/Operators/typeof*
"); background-size: cover; background-position: 0px 2px;">*

2.2 题目二

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

答案:会发生错误
因为function g(){ return 23; }是函数表达式,事实上只有事一个名字,不是一个函数声明
函数实际上是绑定到变量f,不是g。
指定的标识符在函数表达式虽然有其用途:堆栈跟踪是清晰而不是充斥着无名的函数,你可以有一个匿名函数递归调用本身不使用argument.callee
附加:
非常详细的帖子函数表达式,http://kangax.github.io/nfe/*
"); background-size: cover; background-position: 0px 2px;">*

2.3 题目三

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

答案:1

2.4 题目四

var y = 1, x = y = typeof x; x;

答案:”undefined”
通过重写代码如下结果:
var a, b; 展开就是 var a; var b;. A = B = C;相当于 B = C = B;

知道了这一点,我们重写并得到:

var y = 1;
y = typeof x; 
var x = y; 
x;

2.5 题目五

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

答案:”number”
为了便于理解我们继续分解;
第一部分:

var baz = function(){ return 1; };

第二部分:

(function f(f){ return typeof f(); })(baz);

在这里,函数f接受一个参数是另一个函数,f函数内部执行这个实参函数并且返回类型。
无论是从调用该函数返回,即使参数名称f与函数名冲突,函数接受本身作为自己的参数,然后调用,此时就看谁更具有更高的优先级了,显然,参数的优先级更高,所以实际执行的是return typeof 1。

2.6 题目六

var foo = { 
  bar: function() { 
    return this.baz; 
  }, 
  baz: 1 
}; 
(function(){ 
  return typeof arguments[0](); 
})(foo.bar);

答案:”undefined”
为什么是”undefined”?
我们必须要知道this运算符是怎么工作的
JS语言精粹总结的很精炼:
1 纯粹的函数调用
2 作为对象方法的调用
3 作为构造函数调用
4 apply调用
我们看看题目是属于那种环境?
在arguments0中执行了一个方法,arguments[0]就是foo.bar方法,注意:这在foo.bar中的this是没有绑定到foo。虽然 foo.bar 传递给了函数,但是真正执行的时候,函数 bar 的上下文环境是 arguments,并不是 foo。
arguemnts[0] 可以理解为 arguments.0(不过写代码就不要这样了,语法会错误的),所以这样看来,上下文环境是 arguemnts 就没问题了,所以在执行baz的时候自然this就是window了,window 上没有baz属性,返回的就是undefined,typeof调用的话就转换成”undefined”了。

2.7 题目七

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

答案:”undefined”
继续改写一下:

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

把foo.bar存储给f然后调用,所以this在foo.bar引用的是全局对象,所以就没有baz属性了。换句话说,foo.bar执行的时候上下文是 foo,但是当 把 foo.bar 赋值给 f 的时候,f 的上下文环境是 window ,是没有 baz 的,所以是 ”undefined”。

2.8 题目八

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

答案:“number”
逗号操作符的使用可以很混淆,但这段说明它的行为:
var x = (1, 2, 3); x;

x的值是3,这表明,当你有一系列的组合在一起,并由逗号分隔的表达式,它们从左到右进行计算,但只有最后一个表达式的结果保存。由于同样的原因,这个问题可以改写为减少混乱:

var f = (function g(){ 
  return 2; 
})(); 
typeof f;

2.9 题目九

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

答案:“1undefined”
这里有个难点,if 中的 function f(){} 要如何处理?函数声明的实际规则如下:
函数声明只能出现在程序或函数体内。从句法上讲,它们 不能出现在Block(块)({ … })中,例如不能出现在 if、while 或 for 语句中。因为 Block(块) 中只能包含Statement语句, 而不能包含函数声明这样的源元素。另一方面,仔细看一看规则也会发现,唯一可能让表达式出现在Block(块)中情形,就是让它作为表达式语句的一部分。但是,规范明确规定了表达式语句不能以关键字function开头。而这实际上就是说,函数表达式同样也不能出现在Statement语句或Block(块)中(因为Block(块)就是由Statement语句构成的)。

假设代码我们不妨变一下:

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

f在这了没有被定义,所以typeof f 是字符串”undefined” ,字符与数字相加结果也是一个字符串,所以最后的x就是”1undefined”了。

2.10 题目十

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

答案:2
如果是一直看下来的话,这个题目应该是比较简单。简单的来说在执行return之前,函数声明会在任何表达式被解析和求值之前先被解析和求值,即使你的声明在代码的最后一行,它也会在同作用域内第一个表达式之前被解析/求值。
参考如下例子,函数fn是在alert之后声明的,但是在alert执行的时候,fn已经有定义了:
alert(fn()); function fn() { return 'Hello world!'; }

所以题目中函数提升了两次,第二次把第一次覆盖了,所以 return 后面的 f 是 return 语句的下一条语句声明的函数 f 。注意自执行函数 (function f (){})(); 中的 f 并没有函数提升效果,它是表达式。

2.11 题目十一

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

答案:false
怎样去理解?
new f(), 首先这个操作会创建一个新对象并调用构造函数函数这一新的对象作为它的当前上下文对象。简单的说就是:
new f();
依稀记得高级程序设计里面是这么说的:
1 创建空对象。
2 将类的prototype中的属性和方法复制到实例中。
3 将第一步创建的空对象做为类的参数调用类的构造函数
默认如果没有覆盖这个空对象的话,返回this。
var a = new Object; a instanceof Object //为true

我们在看 f() 返回了 return f;那么也就是说这个新的对象是是自身,构造函数本身在 new 的过程中会返回一个表示该对象的实例。但是函数的返回值覆盖了这个实例,这个new 就形同虚设。果f的形式为 function f(){return this}或function f(){}就不一样。
var a = new f(); a instanceof f // false

值得注意的是 instanceof 检测的是原型。

2.12 题目十二

 var x = [typeof x, typeof y][1]; typeof typeof x;

答案:“undefined”
这题目比较简单,注意下返回类型即可。x = [,][1];即 x = typeof y = ‘undefind’。
typeof 返回的是string类型就可以了 ,typeof typeof必然就是’string’了。

2.13 题目十三

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

答案:“undefined”
又是一个恶心的题目,纯文字游戏,大家看仔细看。
先分解一下:
var baz = { foo: { bar: 1 } }; (function(foo){ return typeof foo.bar; })(baz);

去掉函数关联:
var baz = { foo: { bar: 1 } }; var foo = baz; typeof foo.bar;

最后,通过替代我们除去中间变量foo:
var baz = { foo: { bar: 1 } }; typeof baz.bar;

3 写在后面
面试官还有五秒到达战场,请做好准备!

相关文章

  • JS经典笔试题

    原文来自知乎:求职 | 听说集齐了这些Js题,笔试都不怕了呢!,读完以后累觉不爱,过几天还有面试,我真是越挫越勇了...

  • this call apply bind【整理】

    详解JS中的this、apply、call、bind(经典面试题) https://m.jb51.net/arti...

  • 【IMWeb秋招训练营】【Day10】面试题总结

    经典面试题 37.哪些地方会出现css阻塞,哪些地方会出现js阻塞? js的阻塞特性所有浏览器在下载JS的时候,会...

  • 那些年遇到的面试题

    腾讯面试题 据说是小米面试题 答案: 来自国外的一道题 一道经典面试题: 杂 1.JS数据类型有哪些?哪些是引用类...

  • JS经典面试题

    /* console.log(a) //undefined var a = 12 functio...

  • js经典面试题

    一、 输出打印undefined \n undefined \n 12 var 定义的变量 会自动提升值所在作用域...

  • js基础面试题

    面试题:延迟加载JS有哪些方式? 面试题:JS数据类型有哪些? 面试题:JS数据类型考题 考题一: 考题二: 面试...

  • 文摘-20170305

    前端 释义图例详解那道setTimeout与循环闭包的经典面试题js中proto和prototype的区别和关系?...

  • iOS经典面试题总结--内存管理

    iOS经典面试题总结--内存管理 iOS经典面试题总结--内存管理

  • 经典js面试题分析

    http://www.cnblogs.com/xxcanghai/p/5189353.html

网友评论

    本文标题:JS经典笔试题

    本文链接:https://www.haomeiwen.com/subject/cafzrxtx.html