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
对于技术比较泛的工程师来说,可能会蛋疼,但是对于专职的前端工程师,这些是基础……
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
对于技术比较泛的工程师来说,可能会蛋疼,但是对于专职的前端工程师,这些是基础……
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());
为什么啊????
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
对于技术比较泛的工程师来说,可能会蛋疼,但是对于专职的前端工程师,这些是基础……
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();
1.toString();
(1).toString();
-1 .toString();
37 楼
int08h
2011-06-29
xingqiliudehuanghun 写道
昨天去面试也遇到了一个,请输出下面程序的执行结果:
1.toString();
(1).toString();
-1 .toString();
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,可以延长你的寿命。