JavaScript ,雖然Web 開發(fā)設(shè)計師曾像噩夢一樣懼怕它,但不可否認(rèn),它是世界上最流行的編程語言之一,而且越來越被重視。但是在運用過程中,我們發(fā)現(xiàn),JavaScript 擁有很多讓人困惑不解的東西。

  1. 以 Java 命名,跟Java并無關(guān)聯(lián)

  它最初叫 Mocha, 接著改名為 LiveScript,最后才確定命名為 JavaScript,根據(jù)歷史記錄,Java 的命名與 Netscape 和 Sun 之間的合作有關(guān),作為交換條件,Netscape 在他們備受歡迎的瀏覽器中創(chuàng)建了 Java 運行時。值得一提的是,這個名字的出臺幾近一個玩笑,要知道,LiveScript 和 Java 在客戶端腳本方面存在敵對關(guān)系。

  不管怎么說,人們后來不得不一再澄清的一件事就是,JavaScript 和 Java 毫無關(guān)系。

  2. NaN !== NaN

  NaN,表示一個非數(shù)字的值,然而問題是,NaN不等于任何東西,甚至不等于它自己。

  

  這顯然不對,事實上,如果要判斷一個值確實是 NaN,你需要用 isNaN() 函數(shù)。

  3. 全局變量

  對全局變量的依賴一直被視為 JavaScript 最壞的部分(ECMA 的 JavaScript 5 已經(jīng)去掉了全局變量,請參閱 ECMA 推出 JavaScript 5 - 譯者注)。對簡單的頁面,這無所謂,但復(fù)雜的頁面,如果包含大量 JavaScript 腳本,你很難知道某個全局變量是在哪里聲明的,如果幾個全局變量不小心重名,就會引發(fā)錯誤。

  4. Null 是個對象?

  看看這段代碼,它返回的是 object。

  

  這實在令人費解,假如 null 表示空值,它怎么可以是對象?簡單說,它是 JavaScript 最初版本的錯誤,這個錯誤甚至被微軟的 JScript 直接借用。

  5. 那些統(tǒng)統(tǒng)被探測為 Mozilla User-Agent 的瀏覽器

  必須承認(rèn),事實上,這不是 JavaScript 的錯,是各個瀏覽器有意為之。比如,以下是用 JavaScript 探測 Safari 時得到的結(jié)果:

  

  是否注意到其中的 第一個單詞 Mozilla/5.0,為什么 Safari 會被探測為 Mozilla,盡管 Safari 后來已經(jīng)糾正這一問題,但仍然不能解釋為什么它們要這樣誤導(dǎo)開發(fā)者。事實上,你會發(fā)現(xiàn),絕大多數(shù)瀏覽器把他們的 User Agent 設(shè)置為 Mozilla,答案要回到10年前,這更多是一種策略。

  User Agent 是一段用來標(biāo)識當(dāng)前瀏覽器身份的字符串,世界上第一個瀏覽器 Mosaic, 曾這樣標(biāo)志自己:

  

  這很合理,因此當(dāng) Netscape 出來的時候, 它保留了 Mosaic 這個傳統(tǒng),還在后面添加了一個加密方式部分。

  

  到目前為止,一切安好,直到 IE3 發(fā)布,當(dāng) IE3 發(fā)布的時候,Netscape 正如日中天,那時,很多服務(wù)器和程序已經(jīng)部署了客戶端探測機(jī)制,以便認(rèn)出 Netscape,雖然現(xiàn)在看來,這很值得爭議,但當(dāng)時并沒什么。當(dāng) IE 初次推出它們的 User Agent 標(biāo)志的時候,是這個樣子:

  

  這讓 IE 很被動,因為 Netscape 已經(jīng)能被很多服務(wù)器識別,因此,開發(fā)者們干脆希望 IE 被誤認(rèn)為 Mozilla,然后,再單獨加一個 IE 的標(biāo)簽。

  

  如今,幾乎所有瀏覽器都步 IE 后塵,將自己標(biāo)識為 Mozilla,這大概是一種連鎖反應(yīng)。

  6. 不一致的函數(shù)范圍

  參看以下代碼:

  

  foo(bar.method) 返回結(jié)果不同原因是,method 函數(shù)是被當(dāng)作 windows 對象,而不是 bar 下的對象調(diào)用的。要解決這個問題,我們必須從傳遞的匿名函數(shù)中調(diào)用 bar.method() 。

 

  7. 太多的空值類型