Javascript quiz

时间:2021-05-26 07:52:00

作为一个勤劳的corder,在大年三十的前一天还留守在公司的最前线。百无聊赖中看到一套关于js的测试题,测试过后发现有些题还是有很大的意义,至少能够让我门对js基础有所重视。本人将每道题的考察点总结了一下,希望能够帮助还游荡在js门外的同学们,由于本人也是js新手,文中如有不妥望大神们指出,共同进步。

话不多说,直接上题:

1. 下面函数的返回值是?

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

A. "object"  B. "array"  C. "arguments"  D. "undefined"

分析:我们知道在函数体内,标识符是arguments是指向实参对象的引用。arguments并不是真正的数组,它是一个实参对象。每个实参对象都包含以数字为索引的一组元素以及length属性,可以理解它是对象,只是碰巧具有以数字为索引的属性。既然是对象,typeof arguments返回的是必然是object。

2. 下面函数的结果是?

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

A. "number"  B. "undefined"  C. "function"  D. "Error"

分析:定义一个函数可以是:

1.函数声明   function 函数名称 (参数:可选){ 函数体}

2. 函数表达式   function 函数名称(可选)(参数:可选){ 函数体 }

题目中的定义方式为命名函数表达式,函数名g只能在函数体内部访问,因此在函数外部执行g()会报错,结果是D。

如果想进一步了解关于函数命名表达式可以参考本站中汤姆大叔的JavaScript连载系列深入理解JavaScript系列(2):揭秘命名函数表达式

3. 下面函数的返回值是?

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

A. 1  B. null  C. undefined  D. Error

分析:delete可以删除对象的某些属性,但是不能删除arguments对象。因此最终结果仍是1。

4. 下面函数的结果是?

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

A. 1  B. "number"  C. undefined  D. "undefined"

分析:该题我们只需要知道 x = y = typeof x的执行顺序即可。将上述表达式拆分为两步:

1. y = typeof x;  2. x = y。

执行 y = typeof x 的时候x还没有定义,只有typeof一个未定义的变量时会返回"undefined",其他情况均会报错。所以y = "undefined", x = y = "undefined"。

5. 下面函数的返回值是?

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

A. "function"  B. "number"  C. Error  D. "undefined"

分析:将一个函数作为一个函数的参数,f()返回1,typeof f()必然返回"number"。

6. 下面函数的返回值是?

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

A. "object"  B. "number"  C. "function"  D. "undefined"

分析:将foo.bar作为一个函数的参数。一定要看清最后返回的不是arguments[0],而是arguments[0]()。而执行foo.bar( 等同于arguments[0]() )返回的是this.baz,在这里this指向的是arguments对象。arguments对象没有baz属性,因此返回undefined。

7. 下面函数的结果是?

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

A. "object"  B. "number"  C. "function"  D. "undefined"

分析:foo.bar 为 function(){ return this.baz },将 foo.bar 赋给变量 f 并执行返回this.baz,此时this指向window,window并没有一个baz属性,所以最终返回"undefined"。我们可以做个实验,如果在定义对象foo之前加入一句window.baz = 100; 最后返回的值就是"number"。说明this当时指向的是window。

8. 下面函数的结果是?

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

A. "string"  B. "number"  C. "function"  D. "undefined"

分析:我们先来看一个表达式 f = (1,2); f的值最终是2。然后再看这个题目就比较简单了,f 最终执行的是括号里的第二个函数,返回的是"number"。

9. 下面函数的结果是?

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

A. 1  B. "1function"  C. NaN  D. "1undefined"

分析:将一个函数作为 if 判断条件,返回的是true。typeof f的值是"function",1 + "function" = "1function"。

10. 下面函数的结果是?

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

A. "number"  B. "string"  C. "object"  D. "undefined"

分析:x = typeof y。由于y未定义,所以返回的是"undefined"。而typeof ("undefined")返回的是string。

11. 下面函数的结果是?

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

A. "number"  B. Error  C. "object"  D. "undefined"

分析:将{ foo: { bar : 1 } }作为参数传入函数中,传入的参数只是一个对象,并没有将该对象赋给任何一个变量,因此typeof foo.bar返回的是"undefined"。

如果定义var x = { foo: { bar : 1 } },则 x.foo.bar == 1。

12. 下面函数的返回值是?

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

A. 1  B. Error(e.g. "Too much recursion")  C. 2  D. undefined

分析:这个题目涉及到了JS的预解析概念。首先看一下函数的预解析机制:

1、javascript在执行前会进行类似"预解析"的操作:首先会创建一个在当前执行环境下的活动对象,并将那些用var 声明的变量、定义的函数设置为活动对象的属性,但是此时这些变量的赋值都是undefined。

2、在javascript解释执行阶段,遇到变量需要解析时,会首先从当前执行环境的活动对象中查找,如果没有找到‍而且该执行环境的拥有者有prototype属性时则会从prototype链中查找,否则将会按照作用域链查找。遇到var a = …这样的语句时会给相应的变量进行赋值(注意:变量的赋值是在解释执行阶段完成的,如果在这之前使用变量,它的值会是undefined)。

也就是说虽然function f(){return 2;}放在了return的后边,但是它在预解析的阶段就已经定义好了,最终函数f返回的应该是2。更详细的关于函数预解析和作用域链的知识同样可以参考山姆大叔的JavaScript连载系列深入理解JavaScript系列(14):作用域链(Scope Chain)

13. 下面代码的结果是?

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

A. true  B. false

分析:代码的第二行是通过new来创建的f的实例,所以可以把f看为一个构造函数,而构造函数中如果有return,则返回的是return的内容。也就是f本身,因此f instanceof f返回的是false,而f instanceof Function返回的是true。

14. 下面代码的结果是?

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

A. 1  B. Error  C. 2  D. undefined

分析:本人平时很少使用with语句,网上搜了一下关于with的资料。具体解释如下:

with 语句可以方便地用来引用某个特定对象中已有的属性,但是不能用来给对象添加属性。要给对象创建新的属性,必须明确地引用该对象。

而with(function(x, undefined){}) length; 等同于 function fn(x, undefined){}  fn.length。通过测试发现length属性返回的是函数参数的个数,本例中即为2。

结语:

相信看完本篇文章的同学也发现了js基础知识的重要性,本站中山姆大叔的JS连载系列个人感觉质量比较高,如果能够仔细的研读一遍对个人的JS水平会有不小的提高。最后在新春来临之际预祝所有的前端同学马上有Money,成为前端大牛。附上原文地址:http://perfectionkills.com/javascript-quiz/