以前看过一套 JavaScript 题目,借花献佛拿出来分享一下。附带了自己的理解和答案。有争议的地方,欢迎大家指出和讨论。
题目一
1 2 3 |
(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
arguments是对象,伪数组有两件事要注意这里:
参数不是数组,它是一个数组一样的物体,你可以使用方括号和整数索引的元素,但方法通常可在一个如推上不存在参数数组
Array.prototype.slice.call(arguments); 转成数组
当然arguments即使是数组,返回的依然是”object”,因为数组也是对象,附加:typeof 对类型的判断
https://developer.mozilla.org/zh-CN/docs/JavaScript/Reference/Operators/typeof
题目二
1 2 |
var f = function g(){ return 23; }; typeof g(); |
答案:会发生错误
因为function g(){ return 23; }是函数表达式,事实上只有事一个名字,不是一个函数声明
函数实际上是绑定到变量f,不是g.
指定的标识符在函数表达式虽然有其用途:堆栈跟踪是清晰而不是充斥着无名的函数,你可以有一个匿名函数递归调用本身不使用argument.callee
附非常详细的帖子函数表达式
http://kangax.github.io/nfe/
因为function g(){ return 23; }是函数表达式,事实上只有事一个名字,不是一个函数声明
函数实际上是绑定到变量f,不是g.
指定的标识符在函数表达式虽然有其用途:堆栈跟踪是清晰而不是充斥着无名的函数,你可以有一个匿名函数递归调用本身不使用argument.callee
附非常详细的帖子函数表达式
http://kangax.github.io/nfe/
题目三
1 2 3 4 |
(function(x){ delete x; return x; })(1); |
答案:1
参数不可删除
见我发过的帖子(js中的delete定义)
http://www.cnblogs.com/aaronjs/articles/3148934.html
国外的帖子(理解删除)
http://perfectionkills.com/understanding-delete/
参数不可删除
见我发过的帖子(js中的delete定义)
http://www.cnblogs.com/aaronjs/articles/3148934.html
国外的帖子(理解删除)
http://perfectionkills.com/understanding-delete/
题目四
1 2 |
var y = 1, x = y = typeof x; x; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
答案:"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 |
题目五
1 2 3 |
(function f(f){ return typeof f(); })(function(){ return 1; }); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
答案:"number" 为了便于理解我们继续分解: 第一部分 var baz = function(){ return 1; }; 第二部分 (function f(f){ return typeof f(); })(baz)on-h"> f(); })(baz)on-theme-github crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-always" style=" margin-top: 12px; margin-bottom: 12px; font-size: 13px !important; line-height: 15px !important;">
答案:“object”
arguments是对象,伪数组有两件事要注意这里: 参数不是数组,它是一个数组一样的物体,你可以使用方括号和整数索引的元素,但方法通常可在一个如推上不存在参数数组 Array.prototype.slice.call(arguments); 转成数组 当然arguments即使是数组,返回的依然是”object”,因为数组也是对象,附加:typeof 对类型的判断 https://developer.mozilla.org/zh-CN/docs/JavaScript/Reference/Operators/typeof 题目二
答案:会发生错误
因为function g(){ return 23; }是函数表达式,事实上只有事一个名字,不是一个函数声明 函数实际上是绑定到变量f,不是g. 指定的标识符在函数表达式虽然有其用途:堆栈跟踪是清晰而不是充斥着无名的函数,你可以有一个匿名函数递归调用本身不使用argument.callee 附非常详细的帖子函数表达式 http://kangax.github.io/nfe/ 题目三
答案:1
参数不可删除 见我发过的帖子(js中的delete定义) http://www.cnblogs.com/aaronjs/articles/3148934.html 国外的帖子(理解删除) http://perfectionkills.com/understanding-delete/ 题目四
题目五
|