当前位置: 代码迷 >> JavaScript >> 一些十分蛋疼的JavaScript试题
  详细解决方案

一些十分蛋疼的JavaScript试题

热度:183   发布时间:2012-10-08 19:54:56.0
一些非常蛋疼的JavaScript试题
JavaScript有很多地方和我们熟知的C、Java等的编程习惯不同,这些不同会产生很多让人意想不到的事情。前段时间在知乎有人发了写Javascrtip试题,觉得挺好玩的,这里跟大家分享一下。

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

A. "object"
B. "array"
C. "arguments"
D. "undefined"


答案:A

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

A. "number"
B. "undefined"
C. "function"
D. Error

答案:D

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

A. 1
B. null
C. undefined
D. Error

答案:A

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

A. 1
B. "number"
C. undefined
D. "undefined" 

答案: D

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

A. "number"
B. "undefined"
C. "function"
D. Error


答案:A

更多蛋疼的试题,可以看看这里 非常蛋疼的JavaScript试题。
20 楼 clue 2011-06-23  
int08h 写道

这算啥,Firefox有更恶心的
if (0) {
    function abc() {
        
    }
}
abc();

我发的那段代码,在IE下第一个alert弹出的是false 
21 楼 int08h 2011-06-23  
clue 写道
int08h 写道

这算啥,Firefox有更恶心的
if (0) {
    function abc() {
        
    }
}
abc();

我发的那段代码,在IE下第一个alert弹出的是false 

IE的具名函数表达式有2次Evaluate过程,这个在2000年前讨论得比较激烈,现在大家忘得差不多了……
22 楼 shuaiji 2011-06-23  
明明是抄错了啦吧,我看上面有个 3 和 4 是不一样的
23 楼 abraham_xi 2011-06-23  
int08h 写道
1、arguments不是object还能是啥,typeof只能返回number / string / boolean / object / function,明猜也是object……

2、函数表达式中的函数名仅在该函数的执行环境内有效,所以外面g不存在,直接访问不存在的全局属性是ReferenceError

3、var定义的(除非是在eval中用var定义)、参数、某些内置对象和宿主对象具有{DontDelete}特性,必然不能删

4、不知道在说啥,有啥区别吗?

5、就这一题有点意思,关系到进入函数时的参数顺序,依次是函数本身->参数->var声明,因此参数的f覆盖函数自己的函数名f,f()就是1,typeof 1就是number

对于技术比较泛的工程师来说,可能会蛋疼,但是对于专职的前端工程师,这些是基础……


对于第二题IE下面能运行成功,上面对于第二题的解释还正确吗??
24 楼 int08h 2011-06-23  
abraham_xi 写道
int08h 写道
1、arguments不是object还能是啥,typeof只能返回number / string / boolean / object / function,明猜也是object……

2、函数表达式中的函数名仅在该函数的执行环境内有效,所以外面g不存在,直接访问不存在的全局属性是ReferenceError

3、var定义的(除非是在eval中用var定义)、参数、某些内置对象和宿主对象具有{DontDelete}特性,必然不能删

4、不知道在说啥,有啥区别吗?

5、就这一题有点意思,关系到进入函数时的参数顺序,依次是函数本身->参数->var声明,因此参数的f覆盖函数自己的函数名f,f()就是1,typeof 1就是number

对于技术比较泛的工程师来说,可能会蛋疼,但是对于专职的前端工程师,这些是基础……


对于第二题IE下面能运行成功,上面对于第二题的解释还正确吗??


IE那是他的实现错误,说严重点就是IE的BUG……因为根据ECMA262的标准而言,我的解释是正确的,当然如果考虑各浏览器下的表现行为,我的答案需要有一些改动……
25 楼 gaoshouzhen1987 2011-06-23  
写这样代码的人,应该开除掉
26 楼 咖啡豆子 2011-06-23  
这些题都没什么意义,这么写严重恶化了代码质量
27 楼 yf7631497 2011-06-24  
int08h 写道
clue 写道
int08h 写道

这算啥,Firefox有更恶心的
if (0) {
    function abc() {
        
    }
}
abc();

我发的那段代码,在IE下第一个alert弹出的是false 

IE的具名函数表达式有2次Evaluate过程,这个在2000年前讨论得比较激烈,现在大家忘得差不多了……



威武
28 楼 yf7631497 2011-06-24  
yf7631497 写道
int08h 写道
clue 写道
int08h 写道

这算啥,Firefox有更恶心的
if (0) {
    function abc() {
        
    }
}
abc();

我发的那段代码,在IE下第一个alert弹出的是false 

IE的具名函数表达式有2次Evaluate过程,这个在2000年前讨论得比较激烈,现在大家忘得差不多了……



威武



有没有这个板块?
浏览器 N种罪
29 楼 taoge2121 2011-06-24  
第二个,IE运行是number,FF运行是g is not defined

var f = function g() {  
        return 23;  
    };  
alert(typeof g());
为什么啊????
30 楼 zhanghh321 2011-06-24  
super_monkey 写道
int08h 写道
1、arguments不是object还能是啥,typeof只能返回number / string / boolean / object / function,明猜也是object……

2、函数表达式中的函数名仅在该函数的执行环境内有效,所以外面g不存在,直接访问不存在的全局属性是ReferenceError

3、var定义的(除非是在eval中用var定义)、参数、某些内置对象和宿主对象具有{DontDelete}特性,必然不能删

4、不知道在说啥,有啥区别吗?

5、就这一题有点意思,关系到进入函数时的参数顺序,依次是函数本身->参数->var声明,因此参数的f覆盖函数自己的函数名f,f()就是1,typeof 1就是number

对于技术比较泛的工程师来说,可能会蛋疼,但是对于专职的前端工程师,这些是基础……

基本功很扎实嘛。嘿嘿 我也出一题 大家共同提高
console.log(typeof name);  
console.log(typeof age);  
console.log(typeof password);  
var jsstring = "var name = 1; console.log(name);";
eval(jsstring);  
jsstring = "var age = 2; console.log(age);";
new Function(jsstring)();  
jsstring = "var password = 3; console.log(password);";
(function () {
eval(jsstring);
}());  
console.log(typeof name);  
console.log(typeof age);  
console.log(typeof password); 



应该是undefined
undefined
undefined
number
number
number

对否啊
31 楼 super_monkey 2011-06-24  
不对呀,呵呵.主要是后三个log 
32 楼 int08h 2011-06-24  
super_monkey 写道
不对呀,呵呵.主要是后三个log 

我就想问一个问题,你只想考eval的作用域,还是想顺便考考window.name这货?
33 楼 super_monkey 2011-06-24  
int08h 写道
super_monkey 写道
不对呀,呵呵.主要是后三个log 

我就想问一个问题,你只想考eval的作用域,还是想顺便考考window.name这货?


呵呵,其实就是考考eval在不同的执行环境中变量的作用域问题,name: 会放在全局(window),age 和 password会放在他们执行的function范围.这样好处就很明显了,不污染全局。所以后面的3个log应为 number undefined undefined
34 楼 int08h 2011-06-24  
super_monkey 写道
int08h 写道
super_monkey 写道
不对呀,呵呵.主要是后三个log 

我就想问一个问题,你只想考eval的作用域,还是想顺便考考window.name这货?


呵呵,其实就是考考eval在不同的执行环境中变量的作用域问题,name: 会放在全局(window),age 和 password会放在他们执行的function范围.这样好处就很明显了,不污染全局。所以后面的3个log应为 number undefined undefined

嗯,不过如果是浏览器环境下的话,window自带name这属性且有特殊处理,name永远是string……
35 楼 haiyupeter 2011-06-27  
这个明显是在测试javascript的typeof,没啥特别的。。
36 楼 xingqiliudehuanghun 2011-06-29  
昨天去面试也遇到了一个,请输出下面程序的执行结果:
1.toString();
(1).toString();
-1 .toString();
37 楼 int08h 2011-06-29  
xingqiliudehuanghun 写道
昨天去面试也遇到了一个,请输出下面程序的执行结果:
1.toString();
(1).toString();
-1 .toString();

1.toString()过不了语法,-1 .toString()是-(1 .toString())
38 楼 xingqiliudehuanghun 2011-06-30  
他想考察的是1.toString()会报错,但1之后加一个空格就可以了,所以最后的-1_.toString()//_指空格就可以了
39 楼 jordan_micle 2011-06-30  
soni 写道
这么写容易被打死


确实蛋疼。。。离开JS,可以延长你的寿命。
  相关解决方案