近日,在Perfection kill上看到有关javascript quiz。并做了一下,
最终错了2个(#2,#9),但是,这2道题,在Ie和ff下的答案是不一样的?!
附上测试地址:http://perfectionkills.com/javascript-quiz/
下面是个人的解答:
---
代码
//
Q1
( function (){
return typeof arguments; // 很显然这里应该返回的是 "object"
})();
// Q2
var f = function g(){ return 23 ; };
typeof g(); // 在ie下,这里返回的是 "number",但是在ff下,却是Error(g未定义)
// Q3
( function (x){
delete x; // 应该说局部变量是不能被delete的
return x; // 所以这里返回1
})( 1 );
/*
赠送:
delete与变量,有以下关系:
1、对象预定义的属性是不能被delete的;2、通过prototype指定的属性是不能delete的
//关于2,可以理解成只能删除动态附加给对象实例的属性?
3、var定义的(我个人理解是局部变量)是不能被delete的;4、function定义的变量及参数(相当于局变量)是不能被删除的。
关于delete的介绍,这里有:http://tech.idv2.com/2008/01/09/javascript-variables-and-delete-operator/
*/
// Q4
var y = 1 , x = y = typeof x;
x; // 很显然,x应该是undefined
// Q5
( function f(f){
return typeof f(); // 这里的f指的是传进来的匿名函数,因此应该是 "number" (也就是1)
})( function (){ return 1 ; });
// Q6
var foo = {
bar: function () { return this .baz; },
// 但是,调用后,这里的this指向了bar,而bar是没有baz属性的,因此是undefined
baz: 1
};
( function (){
return typeof arguments[ 0 ](); // arguments[0]是foo.bar
})(foo.bar);
// Q7
var foo = {
bar: function (){ return this .baz; }, // 同第6题
baz: 1
}
typeof (f = foo.bar)();
// Q8
var f = ( function f(){ return " 1 " ; }, function g(){ return 2 ; })();
// js的,号操作符,被调用的是第2个函数,因此返回的是"number"
typeof f;
// Q9
var x = 1 ;
if ( function f(){}) {
x += typeof f; // ie下是 1function、ff下是1undefined
}
x;
// Q10
var x = [ typeof x, typeof y][ 1 ]; // x="undefined"
typeof typeof x; // x是字符串,因此应该是 "string"
// Q11
( function (foo){
return typeof foo.bar;
// 非常隐暗的一道题,参数foo指向的是传进来的json对象,而json对象又有个foo属性。
// 因此,此处如果是 typeof foo.foo.bar的话就是"number"
// 但,参数foo本身是没有bar属性的,因此是 "undefined"
})({ foo: { bar: 1 } });
// Q12
( function f(){
function f(){ return 1 ; }
return f(); // 函数定义,后者覆盖前者,因此是 2
function f(){ return 2 ; }
})();
// Q13
function f(){ return f; }
new f() instanceof f;
( function (){
return typeof arguments; // 很显然这里应该返回的是 "object"
})();
// Q2
var f = function g(){ return 23 ; };
typeof g(); // 在ie下,这里返回的是 "number",但是在ff下,却是Error(g未定义)
// Q3
( function (x){
delete x; // 应该说局部变量是不能被delete的
return x; // 所以这里返回1
})( 1 );
/*
赠送:
delete与变量,有以下关系:
1、对象预定义的属性是不能被delete的;2、通过prototype指定的属性是不能delete的
//关于2,可以理解成只能删除动态附加给对象实例的属性?
3、var定义的(我个人理解是局部变量)是不能被delete的;4、function定义的变量及参数(相当于局变量)是不能被删除的。
关于delete的介绍,这里有:http://tech.idv2.com/2008/01/09/javascript-variables-and-delete-operator/
*/
// Q4
var y = 1 , x = y = typeof x;
x; // 很显然,x应该是undefined
// Q5
( function f(f){
return typeof f(); // 这里的f指的是传进来的匿名函数,因此应该是 "number" (也就是1)
})( function (){ return 1 ; });
// Q6
var foo = {
bar: function () { return this .baz; },
// 但是,调用后,这里的this指向了bar,而bar是没有baz属性的,因此是undefined
baz: 1
};
( function (){
return typeof arguments[ 0 ](); // arguments[0]是foo.bar
})(foo.bar);
// Q7
var foo = {
bar: function (){ return this .baz; }, // 同第6题
baz: 1
}
typeof (f = foo.bar)();
// Q8
var f = ( function f(){ return " 1 " ; }, function g(){ return 2 ; })();
// js的,号操作符,被调用的是第2个函数,因此返回的是"number"
typeof f;
// Q9
var x = 1 ;
if ( function f(){}) {
x += typeof f; // ie下是 1function、ff下是1undefined
}
x;
// Q10
var x = [ typeof x, typeof y][ 1 ]; // x="undefined"
typeof typeof x; // x是字符串,因此应该是 "string"
// Q11
( function (foo){
return typeof foo.bar;
// 非常隐暗的一道题,参数foo指向的是传进来的json对象,而json对象又有个foo属性。
// 因此,此处如果是 typeof foo.foo.bar的话就是"number"
// 但,参数foo本身是没有bar属性的,因此是 "undefined"
})({ foo: { bar: 1 } });
// Q12
( function f(){
function f(){ return 1 ; }
return f(); // 函数定义,后者覆盖前者,因此是 2
function f(){ return 2 ; }
})();
// Q13
function f(){ return f; }
new f() instanceof f;
//new f()实际上和f是同一个东西,都是function,因此,两者是==,因此是false
//如果function f(){return 1;},那么返回的是object
// Q14
with ( function (x, undefined){}) length;
// 这样写就明白了 with(function(x,undefined){}){length;}
// 而length,指是的function的形参个数,因此是 2
// Q14
with ( function (x, undefined){}) length;
// 这样写就明白了 with(function(x,undefined){}){length;}
// 而length,指是的function的形参个数,因此是 2