锁定老帖子 主题:一些非常蛋疼的JavaScript试题
精华帖 (0) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-06-22
最后修改:2011-06-22
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试题。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间: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 对于技术比较泛的工程师来说,可能会蛋疼,但是对于专职的前端工程师,这些是基础…… |
|
返回顶楼 | |
发表时间:2011-06-22
3和4不是一样的吗?
|
|
返回顶楼 | |
发表时间:2011-06-22
的确都很蛋疼,正常开发中,基本是不会用到以上特性的,反而是应尽量避免它们。
代码写出来不只是给计算机看,还要给人看,万一哪天因为很久没用,导致自己都看不懂,岂不是很尴尬... 嗯,可能3/4题涉及的东西在解决内存释放问题时会用到,如果有闭包引用到了,置null就好。 |
|
返回顶楼 | |
发表时间: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题的结论 |
|
返回顶楼 | |
发表时间: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文件都是一个“类”,对外的只有接口、事件,全局变量是绝对禁止的 |
|
返回顶楼 | |
发表时间: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的 表示 不淡定。。。。 |
|
返回顶楼 | |
发表时间: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); |
|
返回顶楼 | |
发表时间:2011-06-22
第二个
运行了一下是 “number” 应该选A吧。 |
|
返回顶楼 | |
发表时间:2011-06-22
苍山洱海 写道 第二个
运行了一下是 “number” 应该选A吧。 用的是IE吧 |
|
返回顶楼 | |