一道精妙的题目及解答:

f = function() { return true; };
g = function() { return false; };

(function()
{
   
 if (g() && [] == ![])
 {
  f = function f()
  {
   return false;
  };
  
        function g()
  {
   return true;
  }
    }
})();

alert(f()); // true or false ?


请先思考。。。。。
















答案很多。

(1) firefox 下 输出true

    参考资料 :https://developer.mozilla.org/en/JavaScript/Guide/Functions

    文章指出:

A function can be defined based on a condition. For example, given the following function definition:

view plainprint
?
if (num == 0){  
  function myFunc(theObject) {  
    theObject.make 
= "Toyota"  
  }  
}  
the myFunc function is only defined 
if the variable num equals 0. If num does not equal 0, the function is not defined, and any attempt to execute it will fail.



所以在if这关就过不去。所以直接返回true

(2)chrome  输出 false 

在chrome 以及IE 9中是脚本引擎是符合ECMA 之规范,所以脚本  function g() 
在 匿名函数体中有预解析(可查看浅谈JavaScript 的运行机理

(3)IE 6,7,8 输出false 

到跟chrome不同,其中IE 6,7,8 中错误的将 f = function f() 也在匿名函数中预解析至顶部声明。



很不是很明了了?

对了if 中也埋藏了机关: 

1.运算符优先级
2. 类型转换;
3.== 与 === 的区别

因为![] 为false ,于是会将[] 转换成字符串"" ,在== 不检查类型的情况下,非严格的将空字符串与false 匹配上。

所以会有([] == ![] )   为 true
    

在JS 手册中关于 ‘==’ 有 原文: “如果两表达式的类型不同,则试图将它们转换为字符串、数字或 Boolean 量。”

posted on 2010-10-11 03:48 -274°C 阅读(296) 评论(0)  编辑  收藏 所属分类: web前端

只有注册用户登录后才能发表评论。


网站导航:
 

常用链接

留言簿(21)

随笔分类(265)

随笔档案(242)

相册

JAVA网站

关注的Blog

搜索

  •  

积分与排名

  • 积分 - 911485
  • 排名 - 40

最新评论