javascript 中的 undefined 与 null 的区别

在Javascript中有两个值用来代表类似空值的概念,undefined和null,这两个很容易被混淆,他们表示的是两个不同的概念。

先说说undefined:

Javascript中的变量是弱类型的(关于这个我想就不用我多解释啦), 所以声明变量的时候只需使用var关键字即可。如果是像C这样的强类型语言, 声明变量的时候如果没有指定初始值,那么会给他一个默认值,比如int变量的默认值是0。但是在Javascript这样的弱类型语言中,没有办法确定到底该给这样的变量一个什么样的默认值,比如我声明一个变量

var v1;

 是给他false还是0,或者是'' ?

因为没有类型,所以无法确定。 在Javascript中对于这种生命后没有给定初始值的变量,就给他一个undefined。不过前提是这个变量必须已经声明,如果对于没有声明过的标识符,就会出错。看看下面的代码。

 

1     var v1;
2     alert(v1);  //undefined
3     alert(v2);  //报错

 

再来说说null,Javscript有几个基本类型,Number,String,Boolean,Object。对于Object 类型的变量,他有两种情况,一种是他是一个对象的实例,另一种他是一个空引用null,熟悉类似Java这样面向对象语言的朋友应该很容易理解。对于这两种情况,他们的类型都是Object。Javascript中的变量,在给他赋值的时候,才

会确定它的类型,比如下面这样。

 

 1     var v1 = 1;
 2     var v2 = true;
 3 
 4     alert(typeof v1);   //number
 5     alert(typeof v2);   //boolean
 6 
 7     v2 = new Date();
 8     alert(typeof v2);   //object
 9 
10     v2 = "str";
11     alert(typeof v2);   //string
12     
13     v2 = null;
14     alert(typeof v2);   //object

 

 

可以看到,null在 Javascript中代表一个特殊的Object类型的值,他用来表示空引用的概念,如果要将一个标识符声明称object类型,但是暂时不给他实例,那么就可以将它先初始化为null,以便以后使用。

 

不一定绝对正确,简单来说,对于所有变量,只要声明后还没有指定初始值 ,那么他就是undefined,如果是Object类型用来表示空引用的概念,那么就是用null来表示。

 

标签: Javascript, web, js
posted @ 2010-03-17 10:32 Springfield 阅读(1805) 评论(8) 编辑 收藏

 回复 引用 查看   
#1楼 2010-03-17 10:38 czjone      
总结得好
 回复 引用 查看   
#2楼 2010-03-17 11:17 Inside_      
大哥,你连什么是强类型什么是弱类型都没有搞明白。

C语言是明显的弱类型语言。

强类型是指一个变量的类型一旦确定,不能轻易的转换到其它类型,必须写下转换方法显式转换;例如Java、C#;一个特别的例子是Python,它是动态语言,但它是强类型的。

C语言由于指针的缘故,各种类型的指针可以隐式转换到void*,所以它是弱类型。

最好把动态、静态;强类型、弱类型的区别和联系搞清楚,先去补补课吧。

 回复 引用 查看   
#3楼 2010-03-17 13:52 兰中      
引用Inside_:
大哥,你连什么是强类型什么是弱类型都没有搞明白。

C语言是明显的弱类型语言。

强类型是指一个变量的类型一旦确定,不能轻易的转换到其它类型,必须写下转换方法显式转换;例如Java、C#;一个特别的例子是Python,它是动态语言,但它是强类型的。

C语言由于指针的缘故,各种类型的指针可以隐式转换到void*,所以它是弱类型。

最好把动态、静态;强类型、弱类型的区别和联系搞清楚,先去补补课吧。


强弱类型是指定义数据类型的要求吧?
我的理解:
强类型语言:如c/c++就是各种变量在其各自的作用域使用之前都要由开发者定义类型,并交由编译器分配内存空间.
弱类型语言:如vb,在使用变量之前如果不定义类型,则系统就直接定义为变体型,并分配空间.
貌似学术界还没有"strongly typed language"的统一的定义。

 回复 引用 查看   
#4楼 2010-03-17 14:03 duncannjm      
这下明白了,谢谢楼主啊!
 回复 引用 查看   
#5楼 2010-03-17 14:14 Inside_      
@兰中
你那个说法跟类型的强弱基本没有关系,你对动态、静态;强类型弱类型的理解不够,所以我举了Python这个例子,因为它特别在本身是动态语言,但却是强类型的,你有兴趣可以自己研究。

补充一点,语言是动态还是静态跟它是强类型还是弱类型没什么必然联系。

最后重申,C语言是弱类型的,千万不要误导初学者。

 回复 引用 查看   
#6楼 2010-03-17 16:28 侯德军      
@Inside_

这里是引用其他人说法(仅供参考)
“孤立地判定一个语言是弱类型还是强类型是没有意义的,因为在学术界还没有"strongly typed language"的统一的定义。我们只能说语言A相对于语言B是强类型的。笼统地将,强类型语言是能够禁止任何违反类型系统的代码的语言,或者说是能够捕获所有违反类型系统的错误的语言。我们说C++相对于C是强类型的,是因为C++禁止了一些C中的隐式转换,比如将void*转换为任意的指针类型。”

 回复 引用 查看   
#7楼 2010-03-17 17:08 Steven Chen      
翻开js的历史,这本身就是一个Bug.
 回复 引用 查看   
#8楼 2010-03-21 22:23 heaiping      
增长知识了,谢谢bz