转载:http://blog.csdn.net/natineprince/archive/2009/11/08/4787689.aspx
<
div>
<
div class="Apple-style-span" style="font-family:verdana, sans-serif;font-size:12px;line-height:18px;text-align:left;">
<
div class="blogstory" style="font-size:14px;line-height:21px;">
<
ul style="margin-top:5px;margin-bottom:5px;margin-left:1em;list-style-type:none;">
<
ol style="margin-top:5px;margin-bottom:5px;margin-left:1em;list-style-type:none;">
看到上面的例子后,你还有疑问吗?
联系一下我们前面所说的内容,如果调用一个没有声明的变量被直接调用,应该是会报错的,但上例没有,这就证明了undefined是JS里固有的变量。而且,根据typeof的结果,这个变量的数据类型是undefined。但它不是一个Object。而且不能用instanceof来判断他是不是undefined实例。
那么,让我们来小结一下:undefined是一种类似单态的数据类型,他在全局作用域中以变量标识undefined存在,并且拥有唯一值undefined。
除了上面所说的以外,还有一些需要注意的地方,请看下例:
所以,如果你需要判断一个变量是否已声明,请使用typeof运算符,再和"undefined"这个字符串比较。如果你看得仔细,你或许会产生一个疑问:在上一节中不是说,如果在作用域链中找不到变量标识的时候,不是会创建空值标识吗?如果你有此一问,那么我得赞你一下,你真的用心思考了!这个问题将在稍后解答。
另外,别以为undefined和字符串"undefined"是相等的,undefined不是字符串,而是另一种数据类型。
你有感到奇怪了么?奇怪在哪里呢?嗯。我也觉得奇怪:为啥typeof的运算结果会是“object”,但instanceof判断又为false呢?但对于这个问题,能找到的唯一解答是如此描述的:
“这点潜在的混淆是为了向下兼容。”
但怎么向下兼容,我已经不能考究也不想考究下去了。我能告诉大家的是typeof null的返回值“object”是ECMA-262中规定的内容。并且这规定只是为了兼容性,实际上null并不是一个Object的实例。
至此,我们再小结一下:null和undefined很相似,只是我们从根本上还是属于两种不同的数据类型。但是他们真的“不同”吗?让我们再来看看下面的例子:
那么,看来JS解释器一般认为null和undefined是相等的了,虽然在严格等于运算时结果是false。(据说这是为了兼容以往的浏览器中没有undefined而设的。)
由此引起了我们另一个思考:他们到底有何异同呢?实际上,导致他们严格等于运算返回false的是typeof的运算——在运算符节再详细解释吧。但他们其实还有一个语言规范层级的区别:undefined是作为Global对象的属性存在的,而null则是ECMA规范中设定的一个字面值。换句话说,undefined是存放在Global中的属性(所以像单态),而null是解释执行时产生的值。然而对他们的值作强制转换还是相同的,如:
还值得注意的是,和其他语言不同,他们和0值是不相等的,除非转换成布尔值:
另外,它们都不带属性的:
最后,提一点我在项目中经常看到的,某些程序员喜欢将一些控件的属性是否定义的判定交给字符串"undefined"和null,但实际上只有null在起作用呢。
<
div class="dp-highlighter" style="margin:18px 0px;font-family:Consolas, 'Courier New', Courier, mono, serif;font-size:12px;background-color:rgb(231, 229, 220);padding-top:1px;">
<
ol start="100" class="dp-c" style="margin-bottom:1px;margin-left:1em;list-style-type:decimal;border-top-style:none;border-right-style:none;border-bottom-style:none;border-left-style:none;border-width:initial;border-color:initial;list-style-image:initial;background-color:rgb(255, 255, 255);color:rgb(92, 92, 92);">