javascript中的undefined 与 null 的区别  补充篇


Posted in Javascript onMarch 17, 2010

之前三水点靠木发不过类似的文章
JavaScript null和undefined区别分析

JavaScript Undefined,Null类型和NaN值区别

先说说undefined:
Javascript中的变量是弱类型的(关于这个我想就不用我多解释啦), 所以声明变量的时候只需使用var关键字即可。如果是像C这样的强类型语言, 声明变量的时候如果没有指定初始值,那么会给他一个默认值,比如int变量的默认值是0。但是在Javascript这样的弱类型语言中,没有办法确定到底该给这样的变量一个什么样的默认值,比如我声明一个变量
var v1;
是给他false还是0,或者是'' ?
因为没有类型,所以无法确定。 在Javascript中对于这种生命后没有给定初始值的变量,就给他一个undefined。不过前提是这个变量必须已经声明,如果对于没有声明过的标识符,就会出错。看看下面的代码。

var v1; 
alert(v1); //undefined 
alert(v2); //报错

    再来说说null,Javscript有几个基本类型,Number,String,Boolean,Object。对于Object 类型的变量,他有两种情况,一种是他是一个对象的实例,另一种他是一个空引用null,熟悉类似Java这样面向对象语言的朋友应该很容易理解。对于这两种情况,他们的类型都是Object。Javascript中的变量,在给他赋值的时候,才
会确定它的类型,比如下面这样。
var v1 = 1; 
var v2 = true; alert(typeof v1); //number 
alert(typeof v2); //boolean 
v2 = new Date(); 
alert(typeof v2); //object 
v2 = "str"; 
alert(typeof v2); //string 
v2 = null; 
alert(typeof v2); //object

    可以看到,null在 Javascript中代表一个特殊的Object类型的值,他用来表示空引用的概念,如果要将一个标识符声明称object类型,但是暂时不给他实例,那么就可以将它先初始化为null,以便以后使用。
    不一定绝对正确,简单来说,对于所有变量,只要声明后还没有指定初始值 ,那么他就是undefined,如果是Object类型用来表示空引用的概念,那么就是用null来表示。
下面是一些补充:
null :表示无值;
undefined : 表示一个未声明的变量,或已声明但没有赋值的变量,或一个并不存在的对象属性。==运算符将两者看作相等。如果要区分两者,要使用===或typeof运算符。
使用if (!object){}两者就都包含了
补充:2006.12.6
var obj = "aaa"; 
var nullobj; 
if (obj == null || obj == undefined || (!obj) ){ 
alert("obj is null"); 
} 
if (nullobj == null){ 
alert("obj is null"); 
} 
if (nullobj == undefined){ 
alert("obj is undefined "); 
} 
if ( !nullobj ){ 
alert("! obj "); 
}

关于undefined和"undefined的补充(2007/1/30):
JScript中用于表示未定义的undefined标识符到底是表示什么未定义?它和"undefined"(包括"在内)又有什么区别和联系呢?为什么有的时候可以使用undefined来和变量做比较,而有的时候又不行呢?
underfined和"undefined"的区别大家一眼就能看出来。在一般的认知下,我们认为undefined是JScript提供的一个"关键字",而"undefined"却毫无悬念的就是一个字符串,只是引号内的内容长得和undefined一个样。undefined和"undefined"的区别虽然是十分明显的,但它们的联系也是紧密的。
仔细阅读JScript手册,其实这个underfined是一个"已定义"的Global值,而不是它的字面意义所表达的未定义。我们看下面这个代码示例,很有趣:
<script language="Javascript"> 
alert(undefined); 
alert(variable); 
</script>

执行的结果是:
我们稍微修改一下上面的代码,添加一个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的字符串容易拼写错误,对用习惯了的强类型语言的角度来看也显得不专业。
undefined:未定义 如声明一个变量而不赋值给它,或使用一个不存在的对象属性
null:空值 这个真的不好理解
好象是为了兼容以前的浏览器(IE4.0才有undefined吧)而把null和undefined认为是相同
<script language="javascript"> 
var msg="使用未声明的变量undef_x: "; 
if(typeof(undef_x)=="undefined")msg+="undefined "; 
else msg+="defined "; 
msg+="\n"; 
msg+="声明变量后未赋值undef_null_x: "; 
var undef_null_x; 
if(typeof(undef_null_x)=="undefined")msg+="undefined ";else msg+="defined "; 
if(undef_null_x==null)msg+="null ";else msg+="not null"; 
msg+="\n"; 
msg+="变量赋值null null_x: "; 
var null_x=null; 
if(typeof(null_x)=="undefined")msg+="undefined ";else msg+="defined "; 
if(null_x==null)msg+="null ";else msg+="not null"; 
msg+="\n"; 
msg+="变量赋\"\"值 x: "; 
var x=""; 
if(typeof(x)=="undefined")msg+="undefined ";else msg+="defined "; 
if(x==null)msg+="null ";else msg+="not null"; 
alert(msg); 
</script>
Javascript 相关文章推荐
DIV菜单层实现代码
Nov 19 Javascript
js函数名与form表单元素同名冲突的问题
Mar 07 Javascript
分享一些常用的jQuery动画事件和动画函数
Nov 27 Javascript
基于CSS3和jQuery实现跟随鼠标方位的Hover特效
Jul 25 Javascript
JavaScript定义全局对象的方法示例
Jan 12 Javascript
js 显示日期时间的实例(时间过一秒加1)
Oct 25 Javascript
angular中ui calendar的一些使用心得(推荐)
Nov 03 Javascript
微信小程序slider组件使用详解
Jan 31 Javascript
VUE基于NUXT的SSR 服务端渲染
Nov 30 Javascript
jqGrid表格底部汇总、合计行footerrow处理
Aug 21 Javascript
JS实现动态星空背景效果
Nov 01 Javascript
AngularJS实现多级下拉框
Mar 25 Javascript
javascript+iframe 实现无刷新载入整页的代码
Mar 17 #Javascript
js select常用操作控制代码
Mar 16 #Javascript
js实现的日期操作类DateTime函数代码
Mar 16 #Javascript
javascript json2 使用方法
Mar 16 #Javascript
jQuery 选择器理解
Mar 16 #Javascript
jQuery 学习入门篇附实例代码
Mar 16 #Javascript
Jquery Ajax学习实例4 向WebService发出请求,返回实体对象的异步调用
Mar 16 #Javascript
You might like
DC《小丑》11项提名领跑奥斯卡 Netflix成第92届奥斯卡提名最大赢家
2020/04/09 欧美动漫
sony ICF-2010 拆解与改装
2021/03/02 无线电
用户的详细注册和判断
2006/10/09 PHP
PHP商品秒杀问题解决方案实例详解【mysql与redis】
2019/07/22 PHP
基于jquery的修改当前TAB显示标题的代码
2010/12/11 Javascript
Jquery下:nth-child(an+b)的使用注意
2011/05/28 Javascript
Javascript中封装window.open解决不兼容问题
2014/09/28 Javascript
JavaScript数据结构与算法之栈与队列
2016/01/29 Javascript
BootStrap 可编辑表Table格
2016/11/24 Javascript
使用vue.js实现联动效果的示例代码
2017/01/10 Javascript
JavaScript中动态向表格添加数据
2017/01/24 Javascript
AngularJs实现聊天列表实时刷新功能
2017/06/15 Javascript
Async/Await替代Promise的6个理由
2019/06/15 Javascript
layer弹窗在键盘按回车将反复刷新的实现方法
2019/09/25 Javascript
ssm+vue前后端分离框架整合实现(附源码)
2020/07/08 Javascript
[13:18]《一刀刀一天》之DOTA全时刻21:详解TI新赛制 A队再露獠牙
2014/06/24 DOTA
Python的Django框架中的select_related函数对QuerySet 查询的优化
2015/04/01 Python
13个最常用的Python深度学习库介绍
2017/10/28 Python
python中使用正则表达式的后向搜索肯定模式(推荐)
2017/11/11 Python
Python使用matplotlib实现的图像读取、切割裁剪功能示例
2018/04/28 Python
python 利用栈和队列模拟递归的过程
2018/05/29 Python
python 获取图片分辨率的方法
2019/01/08 Python
Django框架封装外部函数示例
2019/05/28 Python
Python 使用 attrs 和 cattrs 实现面向对象编程的实践
2019/06/12 Python
使用pyshp包进行shapefile文件修改的例子
2019/12/06 Python
Python2与Python3的区别点整理
2019/12/12 Python
python接口自动化如何封装获取常量的类
2019/12/24 Python
python 代码实现k-means聚类分析的思路(不使用现成聚类库)
2020/06/01 Python
Python第三方库安装缓慢的解决方法
2021/02/06 Python
莱德杯高尔夫欧洲官方商店:Ryder Cup Shop
2019/08/14 全球购物
几个判断型的面试题
2012/07/03 面试题
保护动物的标语
2014/06/11 职场文书
解除聘用合同证明书范本
2014/09/11 职场文书
法人授权委托书
2014/09/16 职场文书
详细总结Python常见的安全问题
2021/05/21 Python
经典《舰娘》游改全新动画预告 预定11月开播
2022/04/01 日漫