论坛首页 Web前端技术论坛

一些非常蛋疼的JavaScript试题

浏览 14397 次
精华帖 (0) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-06-22   最后修改:2011-06-22
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试题
   发表时间:2011-06-22  
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

对于技术比较泛的工程师来说,可能会蛋疼,但是对于专职的前端工程师,这些是基础……
0 请登录后投票
   发表时间:2011-06-22  
3和4不是一样的吗?
0 请登录后投票
   发表时间:2011-06-22  
的确都很蛋疼,正常开发中,基本是不会用到以上特性的,反而是应尽量避免它们。

代码写出来不只是给计算机看,还要给人看,万一哪天因为很久没用,导致自己都看不懂,岂不是很尴尬...

嗯,可能3/4题涉及的东西在解决内存释放问题时会用到,如果有闭包引用到了,置null就好。
0 请登录后投票
   发表时间:2011-06-22  
clue 写道
的确都很蛋疼,正常开发中,基本是不会用到以上特性的,反而是应尽量避免它们。

代码写出来不只是给计算机看,还要给人看,万一哪天因为很久没用,导致自己都看不懂,岂不是很尴尬...

嗯,可能3/4题涉及的东西在解决内存释放问题时会用到,如果有闭包引用到了,置null就好。

其实除了最后一个是很蛋疼,其他的很常见,我们一直在用,但可能你没察觉到

比如第1题,typeof用得够多了,当然对arguments用有点奇怪,但明确知道对象的typeof结果应该是什么,这点大家都做到

比如第2题,典型的自递归用法
(function checkReady() {
    if (document.readyState !== 'complete') {
        setTimeout(checkReady, 0);
    }
}());
第2题说明的一个问题是,这个checkReady在外面是用不了了,要小心些,我们自然不会在外面用,说明我们知道这一点,且一直在遇上这个问题

像第3题,如果你的脚本运行在第三方的网站上(比如广告什么的),设置全局变量的时候就会注意,用var的不能delete,所以可能尽量用window['xxx'] = abc;这样的方法,以便逻辑完成后进行delete操作,用着用着就成了一个best practice,习惯了,但如果哪一天突然思考下,反过来回顾下为什么这么写,就是现在第3题的结论
0 请登录后投票
   发表时间:2011-06-22  
int08h 写道

其实除了最后一个是很蛋疼,其他的很常见,我们一直在用,但可能你没察觉到

比如第1题,typeof用得够多了,当然对arguments用有点奇怪,但明确知道对象的typeof结果应该是什么,这点大家都做到

比如第2题,典型的自递归用法
(function checkReady() {
    if (document.readyState !== 'complete') {
        setTimeout(checkReady, 0);
    }
}());
第2题说明的一个问题是,这个checkReady在外面是用不了了,要小心些,我们自然不会在外面用,说明我们知道这一点,且一直在遇上这个问题

像第3题,如果你的脚本运行在第三方的网站上(比如广告什么的),设置全局变量的时候就会注意,用var的不能delete,所以可能尽量用window['xxx'] = abc;这样的方法,以便逻辑完成后进行delete操作,用着用着就成了一个best practice,习惯了,但如果哪一天突然思考下,反过来回顾下为什么这么写,就是现在第3题的结论

和你们的开发环境不一样,我们是基于ExtJs组件库,自己搭了一套页面框架
1. typeof一般就用Ext.isXX替代了,只有在非常底层的需要考虑性能的地方才用typeof,并且也不太会关注typeof所有可能返回的值
2. 用过var fn = function(){},也用过function foo(){},它们都能实现递归,var fn = function foo(){}这种就几乎没用过了。
(以前还用arguments.callee,但JSLint报警,就放弃了,虽然还是有些不理解)
3. 我们开发时,都是基于组件的,每个JS文件都是一个“类”,对外的只有接口、事件,全局变量是绝对禁止的
0 请登录后投票
   发表时间:2011-06-22  
gonnsai 写道
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. Eorror

答案:D

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

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

答案:A

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

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

答案: D

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

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


答案:A

更多蛋疼的试题,可以看看这里 非常蛋疼的JavaScript试题



3 和 4 不是一摸一样的 哎 不细心啊 
还有貌似 第二题Eorror 是怎么回事啊,只听说过Error的

表示 不淡定。。。。
0 请登录后投票
   发表时间:2011-06-22  
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); 
0 请登录后投票
   发表时间:2011-06-22  
第二个
运行了一下是 “number”
应该选A吧。
0 请登录后投票
   发表时间:2011-06-22  
苍山洱海 写道
第二个
运行了一下是 “number”
应该选A吧。

用的是IE吧
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics