关于perfectionkills上的那些js题

今天晚上研究了下perfectionkills上的14道js题目,说实话,还挺搞脑子的,那么我们下面来分析分析吧~

1.

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

结果是"object",arguments是一个类数组,不论它到底是数组还是对象,typeof的结果肯定是"object"啦,当然类数组本身就是对象,Object.prototype.toString.call(arguments)的结果是[object Arguments]。

2.

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

结果是Error, 会报错Uncaught ReferenceError: g is not defined,这里的g是不存在的,因为这里已经是一个函数表达式了,而不是一个函数声明。

3.

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

结果为1,delete是删除对象中的属性的,对于普通变量或者函数参数无效。

4.

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

结果为"undefined",=赋值是从右向左的,y=typeof x时x还未定义,所以当时的x为undefined,typeof undefined的结果就是"undefined",这里两个undefined是有区别的,x的值的undefined类型是object,但是typeof之后的类型是string。

5.

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

结果为"number",这个玩过闭包的同学都知道function() {return 1}被传入了自执行函数中,所以f()的结果是1,那typeof 1的结果自然是number了。

6.

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

此题结果为"undefined",foo.bar被传入了匿名闭包中,然后在闭包中调用了bar方法,此时bar中的this指向谁呢,当然是谁调用指向谁啦,那就是我们的匿名闭包了,匿名闭包中有baz吗,答案是没有,so~

7.

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

此题依旧"undefined",情况与上题差不多,只不过这里的this指向了window,f虽然得到了bar方法,但是确实在window下调用的。

8.

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

这题答案是"number",这题可能比较晕,里面有两个看似函数声明的东西,是不是会报错呢,其实不会,这里其实可以看作是个表达式,先是var f = function f() {return ‘1‘},再是var f = function g() {return ‘2‘},当然取后定义的啦,所以f妥妥的是2了。

9.

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

这题也很晕,答案更晕"1undefined",我个人是这么理解的,首先function f(){}在if里是true了,而且没有报错,用var在if里可是会报错的哦,但是这里其实并没有声明f函数,不信就在if里console.log(f)试试。

10.

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

答案是"string",这个好像没有什么悬念,x = typeof y,typeof y是undefined,后面就是之前提到过的故事,姓object的undefined变成string,然后再typrof一次,当然就是string了。

11.

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

答案是"undefined",这里的foo本来就在一个对象下面了,那foo.bar肯定找不到东西啊,后面不解释了。

12.

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

答案是2,函数声明提前了,而且覆盖了之前的f。

13.

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

答案是false,这个f不论怎么引用都是f自己,当然不存在谁是谁的实例了。。。把return f换成return 1就true了。

14.

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

答案是2,最伤我脑细胞的一题,其实是我概念不清楚,with的用法请自行百度的,这里想说的是,函数的length值等于参数的个数。。。于是答案是2了,我2了。。。

这套题目虽然很费脑细胞,但是仔细思考一下还是能加强自己对于javascript的理解的。

时间: 2024-10-22 12:51:07

关于perfectionkills上的那些js题的相关文章

在Visual Studio上开发Node.js程序

[题外话] 最近准备用Node.js做些东西,于是找找看能否有Visual Studio上的插件以方便开发.结果还真找到了一个,来自微软的Node.js Tools for Visual Studio(NTVS),虽然现在仅发布了1.0 Alpha版本,但使用起来已经非常方便.而且,其开发团队与Python Tools for Visual Studio(PTVS)是同一个,而PTVS就是Visual Studio 2013中要创建自带的Python项目需要安装的那个程序,所以大可放心的使用NT

在Visual Studio上开发Node.js程序(2)——远程调试及发布到Azure

[题外话] 上次介绍了VS上开发Node.js的插件Node.js Tools for Visual Studio(NTVS),其提供了非常方便的开发和调试功能,当然很多情况下由于平台限制等原因需要在其他机器上运行程序,进而需要远程调试功能,不过还好,NTVS提供的远程调试也非常方便. [系列索引] 在Visual Studio上开发Node.js程序——NTVS介绍及使用 在Visual Studio上开发Node.js程序(2)——NTVS远程调试及发布到Azure [文章索引] NTVS远

在Visual Studio 2013 上开发Node.js程序

[题外话] 最近准备用Node.js做些东西,于是找找看能否有Visual Studio上的插件以方便开发.结果还真找到了一个,来自微软的Node.js Tools for Visual Studio(NTVS),虽然现在仅发布了1.0 Alpha版本,但使用起来已经非常方便.而且,其开发团队与Python Tools for Visual Studio(PTVS)是同一个,而PTVS就是Visual Studio 2013中要创建自带的Python项目需要安装的那个程序,所以大可放心的使用NT

一道js题

<script> var a = 5; function test(){ this.a = 10; a = 15 this.func = function(){ var a = 20 ; alert(this.a); } } var tt = new test(); tt.func(); setTimeout(tt.func, 1000); </script> 这是之前看到的一道js题,其中有a出现了五次,那么到底输出什么呢,我想看了我上一个随笔你应该就明白了. 这个题主要考察两个

一道有趣的js题以及个人的理解

var number = 2; var obj = { number : 4, fn1 : ( function() { this.number *= 2; number=number*2; var number=3; return function() { this.number *= 2; number*=3; alert(number); } } )(), db2:function(){this.number*=2} }; var fn1 = obj.fn1; alert(number);

HTML5 画布上的 Three.js 环境灯光(HTML5 Canvas Three.js Ambient Lighting)

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. HTML5 画布上的 Three.js 环境灯光HTML5 Canvas Three.js Ambient Lighting <!DOCTY

[Cubieboard] 在Cubieboard上安装Node.js和npm

你有两个选择可以实现在Cubieboard上安装NodeJS,下载别人已经编译完成适用于Cubieboard的NodeJS二进制包,或者自己下载源码自行在Cubieboard上进行编译. 使用编译完成的二进制包 在这里下载适用于ARM架构的Node.js,如果在Cubieboard社区找不到相关资源,可以在RaspberryPi社区寻找相近的资源.例如在<Node.js installation for Raspberry Pi>一文中提供了最新的适用于RaspberryPi的Node.js可

一款在论坛上看到的JS封装的随机过渡方式的图片切换效果

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

[js]uploadify结合jqueryUI弹出框上传,js中的冒出的bug,又被ie坑了

引言 最近在一个项目中,在用户列表中需要对给没有签名样本的个别用户上传签名的样本,就想到博客园中上传图片使用弹出框方式,博客园具体怎么实现的不知道,只是如果自己来弄,想到两个插件的结合使用,在弹出框中使用uploadify插件进行上传,每次都会报错很是无语,最后找到解决方案,这里记录一下,算是对工作中遇到的bug的一个总结. bug 这是vs调试状态下,显示的信息.在浏览器端,点击第一次上传按钮,正常,将弹出框关闭后,第二次打开,就会出现问题: 第一次单击上传: 第二次,关闭弹出框,再次单击上传