---恢复内容开始---

题目一

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

答案:“object”

arguments是对象,伪数组有两件事要注意这里:

参数不是数组,它是一个数组一样的物体,你可以使用方括号和整数索引的元素,但方法通常可在一个如推上不存在参数数组;

Array.prototype.slice.call(arguments); 转成数组,当然arguments即使是数组,返回的依然是”object”,因为数组也是对象。

附加:typeof 对类型的判断

https://developer.mozilla.org/zh-CN/docs/JavaScript/Reference/Operators/typeof

题目二

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

答案:会发生错误

因为function g(){ return 23; }是函数表达式,事实上只是一个名字,不是一个函数声明

函数实际上是绑定到变量f,不是g。

指定的标识符在函数表达式虽然有其用途:堆栈跟踪是清晰而不是充斥着无名的函数,你可以有一个匿名函数递归调用本身不使用argument.callee

附非常详细的帖子函数表达式,http://kangax.github.io/nfe/

题目三

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

答案:1

console.log(delete x) 你会发现返回的是false.也就是说删除不成功。关于delete ,给大家介绍一篇文章:https://www.w3cplus.com/javascript/deep-in-delete.html

题目四

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

答案:”undefined”

通过重写代码如下结果:

var a, b; 展开就是 var a; var b;
A = B = C;相当于 B = C = B;

知道了这一点,我们重写并得到:

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

当执行,y = typeof x时,x 还没有被定义,所以y成为字符串”undefined”,然后被分配到x。

题目五

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

答案:”number”

为了便于理解我们继续分解:

第一部分

var baz = function(){ return 1; };

第二部分

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

在这里,函数f接受一个参数是另一个函数,f函数内部执行这个实参函数并且返回类型

无论是从调用该函数返回,即使参数名称f与函数名冲突,函数接受本身作为自己的参数,然后调用,此时就看谁更具有更高的优先级了,显然,参数的优先级更高,所以实际执行的是return typeof 1

题目六

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

答案: “undefined”

为什么是”undefined”?我们必须要知道this运算符是怎么工作的。

JS语言精粹总结的很精炼:

1 纯粹的函数调用

2 作为对象方法的调用

3 作为构造函数调用

4 apply调用

我们看看题目是属于那种环境?

在arguments[0]()中执行了一个方法,arguments[0]就是foo.bar方法,注意:这在foo.bar中的this是没有绑定到foo。虽然 foo.bar 传递给了函数,但是真正执行的时候,函数 bar 的上下文环境是 arguments,并不是 foo。

arguemnts[0] 可以理解为 arguments.0(不过写代码就不要这样了,语法会错误的),所以这样看来,上下文环境是 arguemnts 就没问题了,所以在执行baz的时候自然this就是window了,window 上没有baz属性,返回的就是undefined,typeof调用的话就转换成”undefined”了。

题目七

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

答案 :“undefined”

继续改写一下:

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

把foo.bar存储给f然后调用,所以this在foo.bar引用的是全局对象,所以就没有baz属性了。换句话说,foo.bar执行的时候上下文是 foo,但是当 把 foo.bar 赋值给 f 的时候,f 的上下文环境是 window ,是没有 baz 的,所以是 ”undefined”。

题目八

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

答案: “number”

逗号操作符的使用可以很混淆,但这段说明它的行为:

var x = (1, 2, 3);
x;

x的值是3,这表明,当你有一系列的组合在一起,并由逗号分隔的表达式,它们从左到右进行计算,但只有最后一个表达式的结果保存。由于同样的原因,这个问题可以改写为减少混乱:

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

题目九

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

答案: “1undefined”

这里有个难点,if 中的 function f(){} 要如何处理?函数声明的实际规则如下:

函数声明只能出现在程序或函数体内。从句法上讲,它们不能出现在Block(块)({ … })中,例如不能出现在 if、while 或 for 语句中。因为 Block(块) 中只能包含Statement语句, 而不能包含函数声明这样的源元素。

另一方面,仔细看一看规则也会发现,唯一可能让表达式出现在Block(块)中情形,就是让它作为表达式语句的一部分。

但是,规范明确规定了表达式语句不能以关键字function开头。而这实际上就是说,函数表达式同样也不能出现在Statement语句或Block(块)中(因为Block(块)就是由Statement语句构成的)。

假设代码我们不妨变一下:

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

f在这了没有被定义,所以typeof f 是字符串”undefined” ,字符与数字相加结果也是一个字符串,所以最后的x就是”1undefined”了。

题目十

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

答案 :2

如果是一直看下来的话,这个题目应该是比较简单。简单的来说在执行return之前,函数声明会在任何表达式被解析和求值之前先被解析和求值,即使你的声明在代码的最后一行,它也会在同作用域内第一个表达式之前被解析/求值。

参考如下例子,函数fn是在alert之后声明的,但是在alert执行的时候,fn已经有定义了

alert(fn());
 function fn() {
     return 'Hello world!';
 }

所以题目中函数提升了两次,第二次把第一次覆盖了,所以 return 后面的 f 是 return 语句的下一条语句声明的函数 f 。注意自执行函数 (function f (){})(); 中的 f 并没有函数提升效果,它是表达式。

题目十一

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

答案 :false

怎样去理解?

new f() , 首先这个操作会创建一个新对象并调用构造函数函数这一新的对象作为它的当前上下文对象。

简单的说 ,new f();

依稀记得高级程序设计里面是这么说的:

1 创建空对象。

2 将类的prototype中的属性和方法复制到实例中。

3 将第一步创建的空对象做为类的参数调用类的构造函数

默认如果没有覆盖这个空对象的话,返回this

var a = new Object;
a instanceof Object    为 true

我们在看 f() 返回了 return f;

那么也就是说这个新的对象是是自身,构造函数本身在 new 的过程中会返回一个表示该对象的实例。但是函数的返回值覆盖了这个实例,这个new 就形同虚设。

如果f的形式为 function f(){return this}或function f(){}就不一样。

var a = new f();
a instanceof f  // false

值得注意的是 instanceof 检测的是原型。

题目十二

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

这题目比较简单,注意下返回类型即可。x = [,][1];即 x = typeof y = ‘undefind’。

typeof 返回的是string类型就可以了 ,typeof typeof必然就是’string’了。

题目十三

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

答案:“undefined”

又是一个恶心的题目,纯文字游戏,大家看仔细看。

先分解一下

var baz = { foo: { bar: 1 } };

(function(foo){
     return typeof foo.bar;
 })(baz);

去掉函数关联

var baz = { foo: { bar: 1 } };
var foo = baz;
typeof foo.bar;

最后,通过替代我们除去中间变量foo

var baz = { foo: { bar: 1 } };
typeof baz.bar;

所以现在就很清晰了,属性中没有定义baz;它被定义为baz.foo上了,所以结果是:”undefined”。

---恢复内容结束---

题目一

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

答案:“object”

arguments是对象,伪数组有两件事要注意这里:

参数不是数组,它是一个数组一样的物体,你可以使用方括号和整数索引的元素,但方法通常可在一个如推上不存在参数数组;

Array.prototype.slice.call(arguments); 转成数组,当然arguments即使是数组,返回的依然是”object”,因为数组也是对象。

附加:typeof 对类型的判断

https://developer.mozilla.org/zh-CN/docs/JavaScript/Reference/Operators/typeof

题目二

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

答案:会发生错误

因为function g(){ return 23; }是函数表达式,事实上只是一个名字,不是一个函数声明

函数实际上是绑定到变量f,不是g。

指定的标识符在函数表达式虽然有其用途:堆栈跟踪是清晰而不是充斥着无名的函数,你可以有一个匿名函数递归调用本身不使用argument.callee

附非常详细的帖子函数表达式,http://kangax.github.io/nfe/

题目三

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

答案:1

题目四

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

答案:”undefined”

通过重写代码如下结果:

var a, b; 展开就是 var a; var b;
A = B = C;相当于 B = C = B;

知道了这一点,我们重写并得到:

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

当执行,y = typeof x时,x 还没有被定义,所以y成为字符串”undefined”,然后被分配到x。

题目五

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

答案:”number”

为了便于理解我们继续分解:

第一部分

var baz = function(){ return 1; };

第二部分

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

在这里,函数f接受一个参数是另一个函数,f函数内部执行这个实参函数并且返回类型

无论是从调用该函数返回,即使参数名称f与函数名冲突,函数接受本身作为自己的参数,然后调用,此时就看谁更具有更高的优先级了,显然,参数的优先级更高,所以实际执行的是return typeof 1

题目六

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

答案: “undefined”

为什么是”undefined”?我们必须要知道this运算符是怎么工作的。

JS语言精粹总结的很精炼:

1 纯粹的函数调用

2 作为对象方法的调用

3 作为构造函数调用

4 apply调用

我们看看题目是属于那种环境?

在arguments[0]()中执行了一个方法,arguments[0]就是foo.bar方法,注意:这在foo.bar中的this是没有绑定到foo。虽然 foo.bar 传递给了函数,但是真正执行的时候,函数 bar 的上下文环境是 arguments,并不是 foo。

arguemnts[0] 可以理解为 arguments.0(不过写代码就不要这样了,语法会错误的),所以这样看来,上下文环境是 arguemnts 就没问题了,所以在执行baz的时候自然this就是window了,window 上没有baz属性,返回的就是undefined,typeof调用的话就转换成”undefined”了。

题目七

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

答案 :“undefined”

继续改写一下:

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

把foo.bar存储给f然后调用,所以this在foo.bar引用的是全局对象,所以就没有baz属性了。换句话说,foo.bar执行的时候上下文是 foo,但是当 把 foo.bar 赋值给 f 的时候,f 的上下文环境是 window ,是没有 baz 的,所以是 ”undefined”。

题目八

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

答案: “number”

逗号操作符的使用可以很混淆,但这段说明它的行为:

var x = (1, 2, 3);
x;

x的值是3,这表明,当你有一系列的组合在一起,并由逗号分隔的表达式,它们从左到右进行计算,但只有最后一个表达式的结果保存。由于同样的原因,这个问题可以改写为减少混乱:

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

题目九

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

答案: “1undefined”

这里有个难点,if 中的 function f(){} 要如何处理?函数声明的实际规则如下:

函数声明只能出现在程序或函数体内。从句法上讲,它们不能出现在Block(块)({ … })中,例如不能出现在 if、while 或 for 语句中。因为 Block(块) 中只能包含Statement语句, 而不能包含函数声明这样的源元素。

另一方面,仔细看一看规则也会发现,唯一可能让表达式出现在Block(块)中情形,就是让它作为表达式语句的一部分。

但是,规范明确规定了表达式语句不能以关键字function开头。而这实际上就是说,函数表达式同样也不能出现在Statement语句或Block(块)中(因为Block(块)就是由Statement语句构成的)。

假设代码我们不妨变一下:

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

f在这了没有被定义,所以typeof f 是字符串”undefined” ,字符与数字相加结果也是一个字符串,所以最后的x就是”1undefined”了。

题目十

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

答案 :2

如果是一直看下来的话,这个题目应该是比较简单。简单的来说在执行return之前,函数声明会在任何表达式被解析和求值之前先被解析和求值,即使你的声明在代码的最后一行,它也会在同作用域内第一个表达式之前被解析/求值。

参考如下例子,函数fn是在alert之后声明的,但是在alert执行的时候,fn已经有定义了

alert(fn());
 function fn() {
     return 'Hello world!';
 }

所以题目中函数提升了两次,第二次把第一次覆盖了,所以 return 后面的 f 是 return 语句的下一条语句声明的函数 f 。注意自执行函数 (function f (){})(); 中的 f 并没有函数提升效果,它是表达式。

题目十一

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

答案 :false

怎样去理解?

new f() , 首先这个操作会创建一个新对象并调用构造函数函数这一新的对象作为它的当前上下文对象。

简单的说 ,new f();

依稀记得高级程序设计里面是这么说的:

1 创建空对象。

2 将类的prototype中的属性和方法复制到实例中。

3 将第一步创建的空对象做为类的参数调用类的构造函数

默认如果没有覆盖这个空对象的话,返回this

var a = new Object;
a instanceof Object    为 true

我们在看 f() 返回了 return f;

那么也就是说这个新的对象是是自身,构造函数本身在 new 的过程中会返回一个表示该对象的实例。但是函数的返回值覆盖了这个实例,这个new 就形同虚设。

如果f的形式为 function f(){return this}或function f(){}就不一样。

var a = new f();
a instanceof f  // false

值得注意的是 instanceof 检测的是原型。

题目十二

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

这题目比较简单,注意下返回类型即可。x = [,][1];即 x = typeof y = ‘undefind’。

typeof 返回的是string类型就可以了 ,typeof typeof必然就是’string’了。

题目十三

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

答案:“undefined”

又是一个恶心的题目,纯文字游戏,大家看仔细看。

先分解一下

var baz = { foo: { bar: 1 } };

(function(foo){
     return typeof foo.bar;
 })(baz);

去掉函数关联

var baz = { foo: { bar: 1 } };
var foo = baz;
typeof foo.bar;

最后,通过替代我们除去中间变量foo

var baz = { foo: { bar: 1 } };
typeof baz.bar;

所以现在就很清晰了,属性中没有定义baz;它被定义为baz.foo上了,所以结果是:”undefined”。

看看国外的JavaScript题目的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. JavaScript 题目破解过程与解析

    题目来源 https://www.hackthissite.org/missions/javascript/ HackThisSite JavaScript mission 1-7 1 我先尝试输入  ...

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

    题目1 咋一看这题目,还以为答案选择B呢,其实正确答案为D,知道原因吗?接着往下看 map对数组的每个元素调用定义的回调函数并返回包含结果的数组,咋一看还以为它会像如下这样执行: function t ...

随机推荐

  1. Django项目:CRM(客户关系管理系统)--32--24PerfectCRM实现King_admin自定义操作数据

    #admin.py # ————————01PerfectCRM基本配置ADMIN———————— from django.contrib import admin # Register your m ...

  2. JS 生成二维码和加上logo图片

    参考链接:https://www.cnblogs.com/chiyi/p/5710324.html,http://www.jq22.com/jquery-info294 demo链接:demo查看 d ...

  3. 英特尔人工智能圆桌论坛举行 四位大咖论道AI

    英特尔人工智能圆桌论坛举行 四位大咖论道AI 2017-04-01 17:57     北京2017年4月1日电 /美通社/ -- 毫无疑问,人工智能已是最具变革力的发展趋势之一,在3月31日举行的2 ...

  4. MarioTCP, take it..

    MrioTCP,超级马里奥,顾名思义,他不仅高效,而且超级简易和好玩.同时他可以是一个很简洁的Linux C 开发学习工程.毫不夸张的说,如果全部掌握这一个工程,你会成为一个Linux C的牛人:当然 ...

  5. GIT → 04:Git与代码托管平台

    4.1 Git 与 GitHub比较 Git 是一个版本管理工具 , 只在本地使用的一个版本管理工具,其作用就是可以让你更好的管理你的程序,比如你原来提交过的内容,后面虽然修改过,但是通过git这个工 ...

  6. 关系数据库(ch.2)

    2.1.1 关系 域 笛卡儿积 关系 candiate key 如果一组属性值可以唯一的标识一个元祖,但是他的子集不行,那么这是一个候选码 关系可以由三种类型 基本关系 查询关系 视图 为关系附加如下 ...

  7. new 在C++ 中的用法

    我对C++一无所知 看参考手册 来看一下参考手册,总共有三种用法 下面是网站上给出的例子 // operator new example #include <iostream> // st ...

  8. Leetcode59. Spiral Matrix II螺旋矩阵2

    给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵. 示例: 输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, ...

  9. tinkcmf视频上传大小限制

    /application/Common/Common/function.php 找到upload_max_filesize把后面的数值改成合适的大小(单位是KB)

  10. 对List<Map<String, Object>>集合排序

    private void mySort(List<Map<String, Object>> list) { //list为待排序的集合,按SEQ字段排序 Comparator& ...