[转]看看国外的javascript题目,你能全部做对吗?

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

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

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

题目一

1 (function(){
2   return typeof arguments;
3 })(); 

1 "object"
2 arguments是对象,伪数组有两件事要注意这里:
3 参数不是数组,它是一个数组一样的物体,你可以使用方括号和整数索引的元素,但方法通常可在一个如推上不存在参数数组
4 Array.prototype.slice.call(arguments); 转成数组
5 当然arguments即使是数组,返回的依然是"object",因为数组也是对象,附加:typeof 对类型的判断
6 https://developer.mozilla.org/zh-CN/docs/JavaScript/Reference/Operators/typeof

答案

题目二

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

1 会发生错误
2 因为function g(){ return 23; }是函数表达式,事实上只有事一个名字,不是一个函数声明
3 函数实际上是绑定到变量f,不是g.
4 指定的标识符在函数表达式虽然有其用途:堆栈跟踪是清晰而不是充斥着无名的函数,你可以有一个匿名函数递归调用本身不使用argument.callee
5 附非常详细的帖子函数表达式
6 http://kangax.github.io/nfe/

答案

题目三

1 (function(x){
2   delete x;
3   return x;
4 })(1);

1 1
2 参数不可删除
3 见我发过的帖子(js中的delete定义)
4 http://www.cnblogs.com/aaronjs/articles/3148934.html
5 国外的帖子(理解删除)
6 http://perfectionkills.com/understanding-delete/

答案

题目四

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

 1 "undefined"
 2 通过重写代码如下结果:
 3 var a, b; 展开就是 var a; var b;.
 4 A = B = C;相当于 B = C = B;
 5
 6 知道了这一点,我们重写并得到:
 7 var y = 1;
 8 y = typeof x;
 9 var x = y;
10 x;
11
12 当执行
13 y = typeof x时,x 还没有被定义,所以y成为字符串"undefined",然后被分配到x

答案

题目五

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

 1 "number"
 2 为了便于理解我们继续分解:
 3
 4 第一部分
 5 var baz = function(){ return 1; };
 6
 7 第二部分
 8 (function f(f){
 9   return typeof f();
10 })(baz);
11
12 在这里,函数f接受一个参数是另一个函数,f函数内部执行这个实参函数并且返回类型
13 无论是从调用该函数返回,即使参数名称f与函数名冲突,函数接受本身作为自己的参数,然后调用,此时就看谁更具有更高的优先级了,显然,参数的优先级更高,所以实际执行的是return typeof 1

答案

题目六

1 var foo = {
2   bar: function() { return this.baz; },
3   baz: 1
4 };
5
6 (function(){
7   return typeof arguments[0]();
8 })(foo.bar);

 1 "undefined"
 2 为什么是"undefined"?.
 3 我们必须要知道this运算符是怎么工作的.
 4
 5 JS语言精粹总结的很精炼:
 6 1 纯粹的函数调用
 7 2 作为对象方法的调用
 8 3 作为构造函数调用
 9 4 apply调用
10
11 我们看看题目是属于那种环境?
12 在arguments[0]()中执行了一个方法,arguments[0]就是foo.bar方法
13 注意:这在foo.bar中的this是没有绑定到foo
14
15 虽然 foo.bar 传递给了函数,但是真正执行的时候,函数 bar 的上下文环境是 arguments ,并不是 foo
16 arguemnts[0] 可以理解为 arguments.0(不过写代码就不要这样了,语法会错误的),所以这样看来,上下文环境是 arguemnts 就没问题了,所以在执行baz的时候自然this就是window了,window 上没有baz属性,返回的就是undefined, typeof调用的话就转换成"undefined"了
17
18 附上博文
19 http://www.cnblogs.com/aaronjs/archive/2011/09/02/2164009.html
20
21 MDC
22 https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Operators/Special_Operators/this_Operator#Description

答案

题目七

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

 1 "undefined"
 2 继续改写一下:
 3 var foo = {
 4   bar: function(){ return this.baz; },
 5   baz: 1
 6 }
 7
 8 f = foo.bar;
 9
10 typeof f();
11
12 把foo.bar存储给f然后调用,所以this在foo.bar引用的是全局对象,所以就没有baz属性了
13 换句话说
14 foo.bar执行的时候上下文是 foo,但是当 把 foo.bar 赋值给 f 的时候,f 的上下文环境是 window ,是没有 baz 的,所以是 ”undefined"

答案

题目八

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

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

答案

题目九

1 var x = 1;
2 if (function f(){}) {
3   x += typeof f;
4 }
5 x;

 1 "1undefined"
 2 这里有个难点
 3 if 中的 function f(){} 要如何处理?
 4
 5 函数声明的实际规则如下:
 6
 7 函数声明只能出现在程序或函数体内。从句法上讲,它们 不能出现在Block(块)({ ... })中,例如不能出现在 if、while 或 for 语句中。因为 Block(块) 中只能包含Statement语句, 而不能包含函数声明这样的源元素。另一方面,仔细看一看规则也会发现,唯一可能让表达式出现在Block(块)中情形,就是让它作为表达式语句的一部分。但是,规范明确规定了表达式语句不能以关键字function开头。而这实际上就是说,函数表达式同样也不能出现在Statement语句或Block(块)中(因为Block(块)就是由Statement语句构成的)。
 8
 9 假设代码我们不妨变一下:
10
11 var x = 1;
12 if (function(){}) {
13   x += typeof f;
14 }
15 x;
16
17 var x = 1;
18 x += typeof f;
19 x;
20
21 f在这了没有被定义,所以typeof f 是字符串"undefined" ,字符与数字相加结果也是一个字符串,
22 所以最后的x就是"1undefined"了

答案

题目十

1 (function f(){
2   function f(){ return 1; }
3   return f();
4   function f(){ return 2; }
5 })();

 1 2
 2 如果是一直看下来的话,这个题目应该是比较简单
 3 简单的来说在执行return之前,函数声明会在任何表达式被解析和求值之前先被解析和求值,
 4 即使你的声明在代码的最后一行,它也会在同作用域内第一个表达式之前被解析/求值,
 5 参考如下例子,函数fn是在alert之后声明的,但是在alert执行的时候,fn已经有定义了
 6
 7  alert(fn());
 8
 9   function fn() {
10     return ‘Hello world!‘;
11   }
12
13 所以题目中函数提升了两次,第二次把第一次覆盖了,
14 所以 return 后面的 f 是 return 语句的下一条语句声明的函数 f 。
15 注意自执行函数 (function f (){})(); 中的 f 并没有函数提升效果,它是表达式

答案

题目十一

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

 1 false
 2 怎样去理解?
 3  new f()
 4 首先这个操作会创建一个新对象并调用构造函数函数这一新的对象作为它的当前上下文对象
 5 简单的说
 6
 7 new f();
 8 依稀记得高级程序设计里面是这么说的:
 9 1 创建空对象。
10 2 将类的prototype中的属性和方法复制到实例中。
11 3 将第一步创建的空对象做为类的参数调用类的构造函数
12 默认如果没有覆盖这个空对象的话,返回this
13
14 var a = new Object;
15 a instanceof Object    为 true
16
17
18 我们在看 f() 返回了 return f;
19
20 那么也就是说这个新的对象是是自身,构造函数本身在 new 的过程中会返回一个表示该对象的实例。
21 但是函数的返回值覆盖了这个实例,这个new 就形同虚设
22 果f的形式为 function f(){return this}或function f(){}就不一样
23 var a = new f();
24 a instanceof f  // false
25
26 值得注意的是 instanceof  检测的是原型
27
28 又附上我博客的
29 JS 对象机制深剖——new 运算符
30 http://www.cnblogs.com/aaronjs/archive/2012/07/04/2575570.html

答案

题目十二

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

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

答案

题目十三

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

 1 "undefined"
 2 又是一个恶心的题目,纯文字游戏,大家看仔细看
 3
 4 先分解一下
 5
 6 var baz = { foo: { bar: 1 } };
 7
 8 (function(foo){
 9   return typeof foo.bar;
10 })(baz);
11
12 去掉函数关联
13 var baz = { foo: { bar: 1 } };
14 var foo = baz;
15 typeof foo.bar;
16
17 最后,通过替代我们除去中间变量foo
18 var baz = { foo: { bar: 1 } };
19 typeof baz.bar;
20
21 所以现在就很清晰了,属性中没有定义baz;它被定义为baz.foo上了,所以结果是:”undefined"

答案

题目十四

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

 1 2
 2 with用得很少,with 语句就是用于暂修改作用域链的或者通常用来缩短特定情形下必须写的代码量
 3
 4 使用with语句的JavaScript代码很难优化,因此它的运算速度比不使用with语句的等价代码要慢得多。
 5
 6 而且,在with语句中的函数定义和变量初始化可能会产生令人惊讶的、相抵触的行为,因此我们避免使用with语句
 7
 8 with的用法是这样的:
 9 with(object) {},在大括号里面,可以引用object的属性而不用使用object.attr这种形式。
10 这道题里面,with接受了一个对象,只不过这个对象是函数,函数有length属性,
11 代表形参的个数,所以上面返回的值是2
12
13
14 mozilla with
15 http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Statements:with

答案

时间: 2024-11-05 18:35:04

[转]看看国外的javascript题目,你能全部做对吗?的相关文章

看看国外的javascript题目,你能全部做对吗?(分享)

本文转自@Aaron的博客,拿过来分享一下.原文:看看国外的javascript题目,你能全部做对吗? 题目一: (function(){ return typeof arguments; })(); "object" arguments是对象,伪数组有两件事要注意这里: 参数不是数组,它是一个数组一样的物体,你可以使用方括号和整数索引的元素,但方法通常可在一个如推上不存在参数数组 Array.prototype.slice.call(arguments); 转成数组 当然argume

国外优秀JavaScript资源推荐

JavaScript的优秀资源 原文链接:http://code.tutsplus.com/articles/resources-for-staying-on-top-of-javascript--cms-21369 去年,我写了一篇关于优秀资源之获取JavaScript优秀资源的博文.一年对于互联网来说是很长的,并且我认识到现在可以更新JavaScript资源了.根据用户的采用和接受情况,JavaScript在浏览器和服务器两端迅速的扩展.所以,是时候重访并且更新资源列表,让它有更好的地方停留

我觉得有意思的JavaScript题目(01-05更新中)

对于以下js题目均来至于网络中.有的来至于文章之中,有的也许来至于问答题型中. 如果你有更好的问题解释,请留言交流! 1.相关问题描述:到底该怎么去理解闭包? 代码片段A: !function(){ var num=1; var exp={}; functionadd(num){ return num++; } exp.getAddNum=function(){ return add(num); } window.a=exp; }() console.log(a.getAddNum()); //

分享一道我认为非常有思考价值JavaScript题目

这是一道综合性的题目,如果你能快速清晰的分析整理出来,那我相信你对JavaScript是有一定的理解的了.我会先将题目的图片截取出来,供大家思考,在结尾在给出我的分析过程和答案,作个总结. 好,废话不多说啦,我们马上来看看! 好,希望大家现在好好思考一下,result的值会是多少.下面我会给出答案. 我们用node打印一下看看 答案是 -2,亲爱的朋友们,你做对了吗? 下面我将写出我对这题的思路解析,仅供参考噢. 我们直接看到函数调用 partialFn(f, 2) ,这里的意思就是传入两个参数

汤姆大叔 javascript 系列 第20课 最后的5到javascript题目

博客链接:http://www.cnblogs.com/TomXu/archive/2012/02/10/2342098.html 原题: 大叔注:这些题目也是来自出这5个题目的人,当然如果你能答对4个及以上并且想拿高工资的话,请联系我. 找出数字数组中最大的元素(使用Match.max函数) 转化一个数字数组为function数组(每个function都弹出相应的数字) 给object数组进行排序(排序条件是每个元素对象的属性个数) 利用JavaScript打印出Fibonacci数(不使用全

30个你“不可能全部会做”的javascript题目及答案

1,以下表达式的运行结果是: ["1","2","3"].map(parseInt) A.["1","2","3"]B.[1,2,3]C.[0,1,2]D.其他 2,以下表达式的运行结果是: [typeof null, null instanceof Object] A.["object",false]B.[null,false]C.["object&quo

看看这些JavaScript题目你会做吗?

题目1 咋一看这题目,还以为答案选择B呢,其实正确答案为D,知道原因吗?接着往下看 map对数组的每个元素调用定义的回调函数并返回包含结果的数组,咋一看还以为它会像如下这样执行: function testFuc(a){ return parseInt(a); } console.info(["1","2","3"].map(testFuc)); 但事实上,map中回调函数的语法如下所示:function callbackfn(value, in

30个你 “ 不可能全部会做 ” 的javascript题目

1,以下表达式的运行结果是: ["1","2","3"].map(parseInt) A.["1","2","3"] B.[1,2,3] C.[0,1,2] D.其他 ==============答案:D,parseInt第二个参数范围是:2-32,如果传入0,则默认按照10处理.请自己查看parseInt函数定义 2,以下表达式的运行结果是: [typeof null, null in

30个你不可能全部会做的javascript题目

1,以下表达式的运行结果是: ["1","2","3"].map(parseInt) A.["1","2","3"] B.[1,2,3] C.[0,1,2] D.其他 2,以下表达式的运行结果是: [typeof null, null instanceof Object] A.["object",false] B.[null,false] C.["objec