一道精妙的題目及解答:
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
文章指出:
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 量。”