+ -
当前位置:首页 → 问答吧 → 关于null和undefined的不同的讨论

关于null和undefined的不同的讨论

时间:2010-05-23

来源:互联网

这是一篇讨论,并不是所谓的教程或者笔记。
像所有将要参加面试的同学一样,最近看得特别多的是基础知识。今天对null和undefined产生了疑惑,很大的疑惑。
google了很久,在很多帖子中都以null和undefined详解为题,可是最终我并没有看到什么深入的解释,甚至连最为重要的我们最关注的:在使用上两者有什么区别?使用价值的区别?都没有很好的解释出来。所以我希望在这里留下我一上午所总结的,更为重要的是,我希望了解它们的人能在下边给我更多的启示。
Undefined类型和Null类型是ECMAScript的五种原始类型中的两个,也有人称它们两个为javascript中的两种特殊类型。它们分别都只有一个值,就是undefined和null。在图灵出版社出版的《Javascript高级程序设计》一书上提到,当声明的变量未初始化时,该变量的默认值为undefined(这也很符合这个单词的含义),而对于null,该书写到“undefined实际上是从null派生来的,因此ECMAScript把它们定义为相等,即alert(null==undefined)//true,尽管两个值相等,但是它们的含义不同,undefined是声明了变量但未对其初始化时赋予该变量的值,null则用于表示未存在的对象(type of null =='object'),如果函数或方法要返回的是对象,那么找不到该对象时,返回的通常是null”。
针对上述所讲,我构造了一上午“如果函数或方法要返回的是对象,那么找不到该对象时,返回的通常是null”这样的函数,最后还是没有构造出来。希望强人能帮我构造出来。这可能是null和undefined最大的不同点。
在验证方面null和undefined是有区别和相同的。
比如
复制内容到剪贴板
代码:
var c;
alert(undefined==null)//true
alert(c==undefined);//true
alert(c==null);//true
如果你这样比较是相同的,但是当这个变量没有声明的时候我们应该使用如下的验证方式
复制内容到剪贴板
代码:
<script type="text/javascript">
alert(typeof a =='undefined')
//在未声明变量时就是用变量会直接造成deny
//alert(a==undefined)
</script>
在使用typeof验证空值时,null就失去作用了。
关于null的使用,我认为最大的作用是清空一个变量(因为在验证空值方面有undefined),这可能是在使用上最大的区别。
而且undefined侧重于原始值,而null侧重于对象。

希望大家多批评指正,您的批评是我最大的进步

作者: wifeyang   发布时间: 2010-05-23

一、关于“如果函数或方法要返回的是对象,那么找不到该对象时,返回的通常是null”
     你试一下 document.getElementById(‘theElm’) ,只要HTML里没有ID为'theElm'的元素,就会返回null。

二、关于undefined和null的区别:
   首先,undefined === null  //返回false
   另外,null*1=0 而 undefined*1=NaN

[ 本帖最后由 alsove 于 2010-5-23 13:36 编辑 ]

作者: alsove   发布时间: 2010-05-23

我觉得,undefined是指某样东西不存在;而null是指某样东西存在,但它是空的,除了这个“空”以外什么内容也没有
所以才会有null*1=0 而 undefined*1=NaN。
一个根本不存在的东西当然没法转换成正常数字,而一个空的东西被看做是0也是理所当然

作者: alsove   发布时间: 2010-05-23

感谢你,我都没想到用DOM的函数
您说的很对

作者: wifeyang   发布时间: 2010-05-23

alert(undefined == null) // true
上面的情况,根据ECMAscript规范,取他们的布尔值进行比较,
alert(Boolean(undefined)); //false
alert(Boolean(null)); //false

所以 alert(undefined == null) // true 并不说明 undefined 等价于 null
看两个变量是否完全等价,应该用#2的方法,使用恒等于(===)判断


另外#2的举例(null*1=0 而 undefined*1=NaN)
本质上也应该是这两个值转换成number对象后值不同:
alert(Number(undefined)); //NaN
alert(Number(null)); //0

作者: colinivy   发布时间: 2010-05-23

个人对undefind 和 null 区别的理解:
1. null是对象,所以我们获取一个不存在的DOM对象时,会返回null
2. undefined本身是一种数据类型,但同时它也是window对象的一个特殊属性,所以当我们获取一个不存在,或者未定义的属性值时会返回undefined
alert(undefined in window); // true
alert(document.getElementById('test').xx); // undefined

作者: colinivy   发布时间: 2010-05-23

越来越明晰了

作者: wifeyang   发布时间: 2010-05-23

刚才去试了一下,NULL还真的是个对象,会继承Object.prototype里的东西,以前都没注意,谢谢提醒了!

[ 本帖最后由 alsove 于 2010-5-23 18:43 编辑 ]

作者: alsove   发布时间: 2010-05-23

下面的引用文字均来自ECMA-262第五版。

首先,ECMAScript中有六大数据类型:Undefined, Null, Boolean, String, Number, and Object.
引用:
The ECMAScript language types are Undefined, Null, Boolean, String, Number, and Object.
null不是Object类型,null只是一个特殊的值,属于Null类型,它是Null类型中唯一的值。

至于typeof null,只是一个特例,因为typeof没有返回Null类型的结果。
引用:
8.2 The Null Type
The Null type has exactly one value, called null.
看看instanceof的结果应该会更全面:
alert(typeof null); alert(null instanceof Object);
 提示:您可以先修改部分代码再运行
再来看看typeof这个函数,在ECMA中有一个表格,规定了typeof的操作规则(如下图):



可以看到,实际type为Null的null值,返回的结果是"object"。可见这只不过是一个处理的特例罢了。

[ 本帖最后由 afc163 于 2010-5-23 21:23 编辑 ]

作者: afc163   发布时间: 2010-05-23

正如楼上所言, null 是一种基本数据类型

我在5楼的说法还是有问题的

作者: colinivy   发布时间: 2010-05-24

你可以把null认为是空的对象占位符

作者: yffdsj   发布时间: 2010-05-24

如果undefined理解为“无”,那么null则是“空”的意思了

作者: yffdsj   发布时间: 2010-05-24

同意楼上

作者: vipsir   发布时间: 2010-05-24