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

正好以前也看过一篇,就借花献佛拿出来分享一下 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然后调用,所以thisfoo.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(块)({ ... })中,例如不能出现在 ifwhile 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. 我们在看 f() 返回了 return f;
  18.  
  19. 那么也就是说这个新的对象是是自身,构造函数本身在 new 的过程中会返回一个表示该对象的实例。
  20. 但是函数的返回值覆盖了这个实例,这个new 就形同虚设
  21. f的形式为 function f(){return this}或function f(){}就不一样
  22. var a = new f();
  23. a instanceof f // false
  24.  
  25. 值得注意的是 instanceof 检测的是原型
  26.  
  27. 又附上我博客的
  28. JS 对象机制深剖——new 运算符
  29. 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. mozilla with
  14. http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Statements:with

答案

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

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

    本文转自@Aaron的博客,拿过来分享一下.原文:看看国外的javascript题目,你能全部做对吗? 题目一: (function(){ return typeof arguments; })(); ...

  2. 看看国外的javascript题目,你能全部做对吗?

    叶小钗 的博客最近都在讨论面试题目 正好以前也看过一篇,就借花献佛拿出来分享一下 http://perfectionkills.com/javascript-quiz/ 附带了自己的理解,答案有争议的 ...

  3. 看看国外的JavaScript题目

    ---恢复内容开始--- 题目一 (function(){    return typeof arguments;})(); 答案:“object” arguments是对象,伪数组有两件事要注意这里 ...

  4. 试试看 ? 离奇古怪的javascript题目

    来源地址: http://dmitrysoshnikov.com/ecmascript/the-quiz/#q1 另一篇帖子 看看国外的javascript题目,你能全部做对吗? http://www ...

  5. 容易出错的JavaScript题目集锦

    容易出错的JavaScript题目集锦 1.typeof(null) 会得到什么?object,在JavaScript中null被认为是一个对象. 2.下列代码将输出控制台的是什么?为什么? 1234 ...

  6. C# WinForm 和 javascript进行交互 使用HTML做界面

    01 using System; 02 using System.Collections.Generic; 03 using System.Text; 04 using System.Reflecti ...

  7. 第一百四十三节,JavaScript,利用封装库做百度分享

    JavaScript,利用封装库做百度分享 效果图 html代码 <div id="share"> <h2>分享到</h2> <ul> ...

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

    博客链接:http://www.cnblogs.com/TomXu/archive/2012/02/10/2342098.html 原题: 大叔注:这些题目也是来自出这5个题目的人,当然如果你能答对4 ...

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

    对于以下js题目均来至于网络中.有的来至于文章之中,有的也许来至于问答题型中.如果您有更好的问题解释,请留言交流! 1.相关问题描述:到底该怎么去理解闭包? 代码片段A !function(){ va ...

随机推荐

  1. HDU-1335 Basically Speaking

    http://acm.hdu.edu.cn/showproblem.php?pid=1335 Basically Speaking Time Limit: 2000/1000 MS (Java/Oth ...

  2. 日志配置logback

    在选择项目日志框架时,发现log4j的作者开发了新的日志框架,据说性能提高不少,那就选它了,不过,除了配置上有点不习惯外,最重要的一点 ,打印线程号这个功能依然没有(打印线程名这个东西是在是个鸡肋). ...

  3. cuda(2) 矩阵乘法优化过程

    Created on 2013-8-5URL : http://blog.sina.com.cn/s/blog_a502f1a30101mjch.html@author: zhxfl转载请说明出处 # ...

  4. yum puppet 并整合控制台

    上篇说了下在ubuntu12.04上安装puppet,安装的版本为puppet2.7.11版本,今天尝试了下在CentOS6.4系统上安装puppet 3.1.1版本,本文参考chenshake的文章 ...

  5. Command-line interface

    A command-line interface (CLI), also known as command-line user interface, console user interface, a ...

  6. mysql left( right ) join 使用on 与where的差异

    之前一直很困扰为什么left join要么一查没有数据,要么出现很多条重复数据. 百思不得其解,后来在网上到处找资料,总算明白了. 一定要理解下面几点:  (1)主表条件在on后面时附表只取满足主表筛 ...

  7. UF2.0、O4、UFT、TA众明星背后的秘密

    UF2.0--经纪业务运营平台 O4--投资交易管理系统软件 UFT--证券极速交易系统软件 TA--登记过户系统 -- 说到恒生在业内的明星产品,太多了,小编一口气说不完,但小编只知其一,殊不知这些 ...

  8. iOS9上的Universal Link实现(教程)

    1.Universal Link 理解为苹果官方支持deeplink就行了 2.通过点击HTTP链接启动APP Web・iOS应用在支持Universal Link的前提下,当用户点击特点的链接时会自 ...

  9. JSONP安全防范解决方案新思路

    jsonp安全性防范,分为以下几点:1. 防止callback参数意外截断js代码,特殊字符单引号双引号,换行符均存在风险2. 防止callback参数恶意添加标签(如script),造成XSS漏洞3 ...

  10. 解析xlsx文件---Java读取Excel2007

    关于Java读取Excel2007的文章在Google.百度上搜索一下,没有太好的例子,实现的也不算太好.查看了一下Poi,最新的 POI 3.5 beta 4 支持读写 Excel2007和PPT2 ...