现在的位置: 首页 > 综合 > 正文

javascript中对null, undefined的误解

2013年10月12日 ⁄ 综合 ⁄ 共 2145字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.