在找一些javascript資料的時候,翻看了一些博文, 其中一篇關於對null和undefined的分析的博文 http://blog.csdn.net/leadzen/article/details/3899392, 裡面一些總結, 評論讓我思考不少, 個人認為是一篇理解偏差非常大的文章, 但是訪問量, 回複基本上都是叫好的. 甚至讓我有些懷疑自己(自以為我的javascript知識是遠遠遠遠不夠好的). 停下來想想, 在國內的各個論壇找一些技術文章看的時候,
好像對於90%以上的人對javascript的理解, 有嚴重的偏差(在找一些資料的時候,都不太敢看國內論壇裡的一些文章). 也寫一點東西, 希望能讓自己的思路清晰一些, 也能幫到一些人.
先對javascript本身這個名詞加一些說明, 參見 http://www.w3school.com.cn/js/pro_js_history.asp (w3school.com.cn的內容基本可信, 基本就是國外w3school的翻譯, 裡面的內容基本算是比較權威). 本文後面所有用的ECMAScript代表平時所說的javascript.
還是針對之前提到的博文,作一些說明(博文建議直接找開連結查看,由于格式、篇幅原因,不貼出來)
1. 對於null和undefined,ECMAScript規範中定義了6中資料類型, Null, Undefined, Boolean, Number, String和Object. null和undefined分別是類型Null和Undefined的唯一的值<參見 ecmascript
language specification第4章,第8章>. 而對於null和undefined的比較, 語言規範本身就說明: 在比較 x == y 時, 如果 x 為 null 並且 y 為 undefined
或 者 x 為undefined 並且 y 為 null時, 返回true. 而 !== 符號是跟 === (strict equality) 相對的, 而 undefined === null
是返回false的<具體比較規則參見ecmascript language specification第11.9章>.
所以對於二者的比較結果, 就沒有意外了.
2.關於運算子typeof對null和undefined的運算
對值為Undefined類型執行typeof運算返回"undefined", 對Null類型執行typeof運算,返回"object". 其它類型執行typeof運算傳回值見下表
Table 20 — typeof Operator Results
Type of val |
Result |
Undefined |
"undefined" |
Null |
"object" |
Boolean |
"boolean" |
Number |
"number" |
String |
"string" |
Object (native and does not implement [[Call]]) |
"object" |
Object (native or host and does implement [[Call]]) |
"function" |
Object (host and does not implement [[Call]]) |
Implementation-defined except may not be "undefined" ,"boolean" , "number ", or "string". |
typeof的具體運算規則參見<ecmascript language specification 11.4.3章>.
3.對於null和undefined到其它類型的轉換
3.1 轉Boolean類型
Undefined --> false
Null --> false
Number(+0, -0, NaN)返回false, 其它返回true
String 類型, 空串返回false, 其它返回true.
具體參見<ecmascript language specification 第九章>.
3.2 轉Number類型
Undefine會返回NaN
Null會返回0
4. 關於ECMAScript(javascript)和html
之前提到博文中,博主提到undefined是window的屬性,這句話本身應該是沒錯的,但是這個肯定不是必然的! ECMAScript本身只是一門語言,雖然現在的用途基本上是作為瀏覽器的指令碼語言,但其本身應該是跟瀏覽器沒有任何關係的.而window對象是html
dom模型的一個root對象(global對象), window對象有undefined屬性只是因為瀏覽器javascript引擎的實現. 跟ECAScript本身沒有任何關係.
window對象跟undefined更是沒有任何聯絡.
以上是關於this和undefined的行為的一些分析,主要是看到博文http://blog.csdn.net/leadzen/article/details/3899392之後有感.如果有不正確的地方,歡迎指出.
參考(ECMAScript規範):
http://www.ecma-international.org/ecma-262/5.1/
PDF版本可在我的CSDN資源中下到,也可直接到ecma的網站中下載閱讀.