JavaScript Perfection kill 测试及答案

  下面是选择题:官方地址是 http://perfectionkills.com/javascript-quiz/

  

复制代码 代码如下:

  1.

  (function(){

  return typeof arguments;

  })();

  “object”

  “array”

  “arguments”

  “undefined”

  2.

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

  typeof g();

  “number”

  “undefined”

  “function”

  Error

  3.

  (function(x){

  delete x;

  return x;

  })(1);

  1

  null

  undefined

  Error

  4.

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

  x;

  1

  “number”

  undefined

  “undefined”

  5.

  (function f(f){

  return typeof f();

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

  “number”

  “undefined”

  “function”

  Error

  6.

  var foo = {

  bar: function() { return this.baz; },

  baz: 1

  };

  (function(){

  return typeof arguments[0]();

  })(foo.bar);

  “undefined”

  “object”

  “number”

  “function”

  7.

  var foo = {

  bar: function(){ return this.baz; },

  baz: 1

  }

  typeof (f = foo.bar)();

  “undefined”

  “object”

  “number”

  “function”

  8.

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

  typeof f;

  “string”

  “number”

  “function”

  “undefined”

  9.

  var x = 1;

  if (function f(){}) {

  x += typeof f;

  }

  x;

  1

  “1function”

  “1undefined”

  NaN

  10.

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

  typeof typeof x;

  “number”

  “string”

  “undefined”

  “object”

  11.

  (function(foo){

  return typeof foo.bar;

  })({ foo: { bar: 1 } });

  “undefined”

  “object”

  “number”

  Error

  12.

  (function f(){

  function f(){ return 1; }

  return f();

  function f(){ return 2; }

  })();

  Error (e.g. “Too much recursion”)

  undefined

  13.

  function f(){ return f; }

  new f() instanceof f;

  true

  false

  14.

  with (function(x, undefined){}) length;

  undefined

  Error

  下面是个人的解答:

  

复制代码 代码如下:

  // Q1

  (function(){

  return typeof arguments; //很显然这里应该返回的是 "object"

  })();

  // Q2

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

  typeof g(); //在ie下,这里返回的是 "number",但是在ff下,却是Error(g未定义)

  // Q3

  (function(x){

  delete x; //应该说局部变量是不能被delete的

  return x; //所以这里返回1

  })(1);

  /*

  赠送:

  delete与变量,有以下关系:

  1、对象预定义的属性是不能被delete的;2、通过prototype指定的属性是不能delete的

  //关于2,可以理解成只能删除动态附加给对象实例的属性?

  3、var定义的(我个人理解是局部变量)是不能被delete的;4、function定义的变量及参数(相当于局变量)是不能被删除的。

  关于delete的介绍,这里有:http://tech.idv2.com/2008/01/09/javascript-variables-and-delete-operator/

  */

  // Q4

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

  x; //很显然,x应该是undefined

  // Q5

  (function f(f){

  return typeof f(); //这里的f指的是传进来的匿名函数,因此应该是 "number" (也就是1)

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

  // Q6

  var foo = {

  bar: function() { return this.baz; },

  //但是,调用后,这里的this指向了bar,而bar是没有baz属性的,因此是undefined

  baz: 1

  };

  (function(){

  return typeof arguments[0](); //arguments[0]是foo.bar

  })(foo.bar);

  // Q7

  var foo = {

  bar: function(){ return this.baz; }, //同第6题

  baz: 1

  }

  typeof (f = foo.bar)();

  // Q8

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

  //js的,号操作符,被调用的是第2个函数,因此返回的是"number"

  typeof f;

  // Q9

  var x = 1;

  if (function f(){}) {

  x += typeof f; //ie下是 1function、ff下是1undefined

  }

  x;

  // Q10

  var x = [typeof x, typeof y][1]; //x="undefined"

  typeof typeof x; //x是字符串,因此应该是 "string"

  // Q11

  (function(foo){

  return typeof foo.bar;

  //非常隐暗的一道题,参数foo指向的是传进来的json对象,而json对象又有个foo属性。

  //因此,此处如果是 typeof foo.foo.bar的话就是"number"

  //但,参数foo本身是没有bar属性的,因此是 "undefined"

  })({ foo: { bar: 1 } });

  // Q12

  (function f(){

  function f(){ return 1; }

  return f(); // 函数定义,后者覆盖前者,因此是 2

  function f(){ return 2; }

  })();

  // Q13

  function f(){ return f; }

  new f() instanceof f;

  //new f()实际上和f是同一个东西,都是function,因此,两者是==,因此是false

  //如果function f(){return 1;},那么返回的是object

  // Q14

  with (function(x, undefined){}) length;

  //这样写就明白了 with(function(x,undefined){}){length;}

  //而length,指是的function的形参个数,因此是 2