叶小钗 的博客最近都在讨论面试题目

正好以前也看过一篇,就借花献佛拿出来分享一下 http://perfectionkills.com/javascript-quiz/

附带了自己的理解,答案有争议的地方欢迎大家指出

(function(){ 
  return typeof arguments; 
})(); 
//developer.mozilla.org/zh-CN/docs/JavaScript/Reference/Operators/typeof

题目二

var f = function g(){ return 23; }; 
typeof g();
//kangax.github.io/nfe/

题目三

(function(x){ 
  delete x; 
  return x; 
})(1); 
//perfectionkills.com/understanding-delete/

题目四

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

题目五

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

题目六

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

(function(){  
  return typeof arguments[0](); 
})(foo.bar);
undefined"?. 我们必须要知道this运算符是怎么工作的. JS语言精粹总结的很精炼: 1 纯粹的函数调用 2 作为对象方法的调用 3 作为构造函数调用 4 apply调用 我们看看题目是属于那种环境? 在arguments[0]()中执行了一个方法,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"了 附上博文 http://www.cnblogs.com/aaronjs/archive/2011/09/02/2164009.html MDC https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Operators/Special_Operators/this_Operator#Description

题目七

var foo = { 
  bar: function(){ return this.baz; }, 
  baz: 1 
} 
typeof (f = foo.bar)();
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"
 

题目八

var f = (function f(){ return "1"; }, function g(){ return 2; })(); 
typeof f;
var x = (1, 2, 3); x; x的值是3,这表明,当你有一系列的组合在一起,并由逗号分隔的表达式,它们从左到右进行计算,但只有最后一个表达式的结果保存。由于同样的原因,这个问题可以改写为减少混乱: var f = (function g(){ return 2; })(); typeof f; 关于逗号表达式: 原文: http://www.2ality.com/2012/09/expressions-vs-statements.html 译文: http://www.cnblogs.com/ziyunfei/archive/2012/09/16/2687589.html

 

题目九

var x = 1; 
if (function f(){}) { 
  x += typeof f; 
} 
x;
if 中的 function f(){} 要如何处理? 函数声明的实际规则如下: 函数声明只能出现在程序或函数体内。从句法上讲,它们 不能出现在Block(块)({ ... })中,例如不能出现在 ifwhilefor 语句中。因为 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"了

题目十

(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 并没有函数提升效果,它是表达式

题目十一

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 检测的是原型 又附上我博客的 JS 对象机制深剖——new 运算符 http://www.cnblogs.com/aaronjs/archive/2012/07/04/2575570.html

题目十二

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

答案

这题目比较简单,注意下返回类型即可
x = [,][1];
即 x = typeof y = 'undefind'.
typeof 返回的是string类型就可以了 
typeof typeof必然就是'string'了.
View Code

相关文章:

  • 2022-12-23
  • 2022-03-02
  • 2022-12-23
  • 2021-04-19
  • 2021-10-02
  • 2022-12-23
  • 2021-09-19
  • 2022-01-05
猜你喜欢
  • 2022-03-05
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-07-12
相关资源
相似解决方案