在找一些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的网站中下载阅读.