鸟食轩

 Microsoft .NET[C#] MVP 2003
随笔 - 422, 文章 - 228, 评论 - 5339, 引用 - 172
数据加载中……

JScript中的undefined和"undefined"

    JScript中用于表示未定义的undefined标识符到底是表示什么未定义?它和"undefined"(包括"在内)又有什么区别和联系呢?为什么有的时候可以使用undefined来和变量做比较,而有的时候又不行呢?

    undefined"undefined"的区别大家一眼就能看出来。在一般的认知下,我们认为undefined是JScript提供的一个"关键字",而"undefined"却毫无悬念的就是一个字符串,只是引号内的内容长得和undefined一个样。undefined"undefined"的区别虽然是十分明显的,但它们的联系也是紧密的。

    仔细阅读JScript手册,其实这个undefined是一个"已定义"的Global值,而不是它的字面意义所表达的未定义。我们看下面这个代码示例,很有趣:

<script language="javascript">
alert(undefined);
alert(variable);
</script>

    执行的结果是:
    undefined.png

    我们稍微修改一下上面的代码,添加一个typeof调用来看看:   
<script language="javascript">
alert(typeof undefined);
alert(typeof variable);
</script>

    这下结果应该是什么呢?显示"object""undefined"吗?当然不是了,两个alert调用都将显示"undefined"

    所以undefined是脚本引擎定义的一个常量,它在脚本引擎初始化完毕后存在。它的实际作用是用来表示一个已定义的变量的未初始化状态(uninitialized),比如var i;,这时这个i的值就是undefined,而i是实实在在define了的,只是未初始化。这时我们就可以写这样的表达式来对i做判断,比如if ( i == undefined )。如果从未在代码中出现过的变量被使用,这时的未定义的概念就不是
undefined所描述的未初始化了,而是说明该变量完全未被登记到脚本引擎的上下文中。使用类似if ( abc == undefined )的语句,将得到类似上图中的第二个错误提示。

    在实际使用中,如果使用typeof来判断变量是否未定义,是可以完全兼容未定义(undefined)未初始化(uninitialized)两种情况的,只是很多时我不喜欢使用 if ( typeof xxx == 'undefined' ) 这样的写法,因为literal的字符串容易拼写错误,对用习惯了的强类型语言的角度来看也显得不专业。

posted on 2006-10-14 12:09 birdshome 阅读(10290) 评论(17)  编辑 收藏 所属分类: Jscript&Dhtml开发

评论

#1楼    回复  引用  查看    

以前也碰到过这样的情况,一般为了保证兼容性,不得不用if (typeof(XXX))的形式来判断,总感觉这样写很不爽,不过也没有更好的办法...
2006-10-15 19:37 | Anders.Zhao      

#2楼    回复  引用  查看    

可以用if(!XXX)
2006-10-16 09:03 | Edwin Liu      

#3楼    回复  引用  查看    

搬个板凳,坐着看,真是专业级别的,原来undefined的类型是undefined。

javascript或JScript博大精深,面向对象,封装继承,应有尽有,尽然被同事鄙视的不行了,唉.....
2006-10-16 10:03 | blog小白 [未注册用户]

#4楼    回复  引用  查看    

老大,javacript是基于对象,而不是面向对象.而封装继承,还有多态,好像是面向对象的特点吧.
2006-10-16 10:58 | 深山老妖[匿名]      

#5楼 [楼主]   回复  引用  查看    

@Edwin Liu
你那样的判断对于下面的代码:
if ( !variable )
{
    alert(undefined);
}
来说是错误的,只能得到上图第二个错误。
    未定义的变量在JScript只能出现在两个地方:一是我们上面讲到的tpyeof 关键字之后;二是直接为其赋值(比如 variable = 0;)。除此之外任何地方使用未定义的变量都回得到和上面一样的错误。

@深山老妖[匿名]
    对,JavaScript是基于对象(based object)。但是为了使用方便,我们常常为其模拟出一些面向对象的特点,目的仅仅只是为了便于使用和维护而已。
2006-10-16 11:44 | birdshome      

#6楼    回复  引用  查看    

一般来说,应该严格遵守先定义再使用的原则,所以在未定义a时使用 if(!a){...} 时,肯定会出错,这可以帮助你立刻进行代码检查。

另一方面,因大多数情况下使用的是命名空间式的方式,这种情况下就没有声明变量的问题了,所以 if(!ns.a) 应该是最好用的方法。
2006-10-17 09:20 | Edwin Liu      

#7楼    回复  引用  查看    

undefined 还是 underfined?有几处混了.
2006-10-18 22:02 | 文锐      

#8楼    回复  引用  查看    

小梦
2007-02-04 12:42 | 小梦 [未注册用户]

#9楼    回复  引用  查看    

你好

#10楼    回复  引用  查看    

分析透彻啊!顶一个
2007-05-17 13:49 | hellohzq [未注册用户]

#11楼    回复  引用  查看    

基于原型(prototype)
2007-06-04 18:28 | 化石 [未注册用户]

#12楼    回复  引用  查看    

楼主,你的文章中有一个地方是不是写错了,就是这undefined关键字,有两处写成了underfined ,是不是该改一下呢?
2007-06-19 21:10 | 小娜娜 [未注册用户]

#13楼 [楼主]   回复  引用  查看    

@小娜娜
已更正,谢谢。
2007-06-19 21:42 | birdshome      

#14楼    回复  引用  查看    

这时的未定义的概念就是不undefined所描述的未初始化了
--------what you mean?
2007-07-05 10:13 | kevin [未注册用户]

#15楼 [楼主]   回复  引用  查看    

@kevin
不好意思,“不是”被我写成“是不”了,谢谢您的斧正:)
2007-07-05 22:03 | birdshome      

#16楼    回复  引用  查看    

undefined是常量吧
[http://www.hoopower.com]
2007-08-03 16:06 | 琥珀 [未注册用户]

#17楼    回复  引用  查看    

值undefined并不等同于未定义的值,
typeof运算符并不真正区分这两种值.
对于为定义的变量使用typeof以外的运算符会提示语法错误
2007-09-21 17:08 | 胖在一方