作为一个勤劳的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/

Javascript quiz的更多相关文章

  1. 一些牛逼哄哄的javascript面试题

    今天我们来对这5个题目详细分析一下,希望对大家有所帮助. 注: 问题来自大名鼎鼎的前端架构师Baranovskiy的帖子<So, you think you know JavaScript?&g ...

  2. JavaScript面试时候的坑洼沟洄——逗号、冒号与括号

    看完了javaScript数据类型和表达式与运算符相关知识后以为可以对JavaScript笔试题牛刀小试一把了,没想到有一次次的死在逗号,冒号和括号上,不得已再看看这几个符号吧. 逗号 逗号我们常见的 ...

  3. JavaScript面试时候的坑洼沟洄——数据类型

    前些日子写了篇关于最近找工作的一些感受的博客 找工作的一些感悟--前端小菜的成长,没想到得到了很多园友的共鸣,得到了很多鼓励,也有园友希望我分享一些笔试.面试的经验.我觉得分享一些笔试题没太多价值,对 ...

  4. 14 个折磨人的 JavaScript 面试题

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

  5. 深入理解JavaScript系列(20):《你真懂JavaScript吗?》答案详解

    介绍 昨天发的<大叔手记(19):你真懂JavaScript吗?>里面的5个题目,有很多回答,发现强人还是很多的,很多人都全部答对了. 今天我们来对这5个题目详细分析一下,希望对大家有所帮 ...

  6. JS逗号、冒号与括号

    JavaScript面试时候的坑洼沟洄——逗号.冒号与括号   看完了javaScript数据类型和表达式与运算符相关知识后以为可以对JavaScript笔试题牛刀小试一把了,没想到有一次次的死在逗号 ...

  7. W3Schools Quizzes

    W3Schools Quizzes Test your skills https://www.w3schools.com/quiztest/default.asp Quiz HOME Quiz HTM ...

  8. codecademy quiz——JavaScript Promise

    Evernote Export What is the fulfilled value of Promise.all()?  A Promise     An object     An array ...

  9. [js测试]JavaScript Web Quiz By davidshariff

    Question1 var foo = function foo() { console.log(foo === foo); }; foo(); 输出是"true",因为foo就指 ...

随机推荐

  1. rsyslog 日志服务器接收日志权限问题

    rsyslog 权限: 默认 [root@dr-mysql01 zjzc_log]# ls -ltr zj-frontend0*-access*27 -rw------- 1 root root 32 ...

  2. http调试工具,linux调试工具

    charles Linux下Web性能压力测试工具http_load linux 下的socket 调试工具 netcat Linux下四款Web服务器压力测试工具(http_load.webbenc ...

  3. HDU_1010——小狗走迷宫DFS

    Problem Description The doggie found a bone in an ancient maze, which fascinated him a lot. However, ...

  4. Vim--写在开始

    这是Vim的学习记录,结合Vim使用技巧一书.

  5. 算法导论(第三版)Problems2(归并插入排序、数列逆序计算)

    讨论内容不说明,仅提供相应的程序. 2.1:归并插入排序θ(nlgn) void mergeInsertionSort(int a[], int l, int r, int k) { int m; & ...

  6. 你需要知道的九大排序算法【Python实现】之快速排序

    五.快速排序 基本思想:  通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,则分别对这两部分继续进行排序,直到整个序列有序. 算法实现: ​ #coding: ...

  7. assertion的语法和语义

    .1) 语法表示 在语法上,为了支持assertion,Java增加了一个关键字assert.它包括两种表达式,分别如下: assert expression1; assert expression1 ...

  8. Android设置上下边框或者左右边框

    <?xml version="1.0" encoding="utf-8"?> <com.sunskyjun.fwproject.widgts. ...

  9. C++类的const成员函数、默认的构造函数、复制形参调用函数(转)

    C++类的const成员函数 double Sales_item::avg_price() const { } const关键字表明这是一个const成员函数,它不可以修改Sales_item类的成员 ...

  10. Android(java)学习笔记261:JNI之编写jni程序适配所有处理器型号

    1. 还是以"02_两个数相加"为例,你会发现这个jni程序只能在ARM处理器下运行,如下:  如果我们让上面的程序运行在x86模拟器上,处理平台不对应,报如下错误: 03-29 ...