Fork me on GitHub

几道有意思的js题

今天看文档发现一个有点意思的题目:

1
2
3
4
(function(x){
delete x;
alert(x);
})(1+5);

最开始我以为答案是undefined,但文档上的答案令我百思不得其解:“函数参数无法 delete 删除, delete 只能删除通过 for in 访问的属性。删除失败也不会报错,所以代码运行会弹出 1”。delete不能删除那么答案也应该是 6 呀,然后我测试了一下果然是6 = =

这种题目平常可能很难用上,不过考验一下基础概念应该还是很有趣的。于是我又找了一些类似的题目瞅瞅:

1

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

答案:’object’
解释:考验对typeof和arguments的理解。arguments 是对象,并且typeof [1,2] == ‘object’

2

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

答案:js报错
解释:考验函数的声明方法。因为函数g未定义。在 JS 里,声明函数只有 2 种方法:

第 1 种: function foo(){…} (函数声明)

第 2 种: var foo = function(){…} (等号后面必须是匿名函数,这句实质是函数表达式)

此处g是函数名,然而第一行不是一个函数声明,因此函数名g仅能在该函数内部被访问到,外部访问不到。

3

1
2
var y = 1, x = y = typeof x;
console.log(x);

答案:undefined
解释:考验赋值运算。先将 typeof x 赋值给 y ,此时 x 未定义,故为 “undefined”,最后将 y 的值赋给 x

4

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

这道题让我逻辑混乱了都= =

答案:number
解释:在函数里的 f() 其实是参数的那个 f 的执行结果,所以是 typeof 1,也就是 “number”,相当于:

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

5

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

答案:undefined
解释:考验this的指向。这里的 this 指的是 arguments

6

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

这道题没弄懂感觉和上一道有点类似= =

答案:undefined
解释:考验this。因为CallExpression是不带有上下文信息,this会指向global;当你以foo.bar() 调用时,被调用的function是「MemberExpression」,而如果进行了f=foo.bar()赋值之后,那么function就会变成「CallExpression」了,因此this绑定就失效了。

7

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

答案:number
解释:f=2。只有最后面的函数会被执行。逗号除了作为分隔符,也是一个操作符,总是返回最后一项。例如:var num = (1,2,3,4) // num=4

8

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

答案:1undefined
解释:括号内的 function f(){} 不是函数声明,会被转换成 true (只有””(空字符串)、0、NaN、null、undefined的布尔值是false),因此 f 未定义。如何判断是否是函数声明:function这个关键词之前有任何东西,那么这都不是一个函数声明,而是函数表达式。

9

1
2
var x = [typeof x, typeof y][1];
console.log(typeof typeof x);

答案:string
解释:第一行执行完后 x === “undefined” ,所以连续求 2 次 typeof 还是 “string”

10

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

答案:2
解释:由于声明提升,后面的 f() 会覆盖前面的 f()。function声明和var声明不同,var声明对于重复的声明是忽略的,而function声明则是覆盖。

11

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

答案:2
解释:with 限定了作用域是这个函数,function.length 返回函数的参数个数,所以是 2。
undefined 虽然是关键词,但可以被覆写。但 null 不能。

参考

https://www.zhihu.com/question/34079683/answer/57863909

-------------完结撒花 -------------