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 相关文章推荐
jQuery使用动态渲染表单功能完成ajax文件下载
Jan 15 Javascript
jquery实现点击查看更多内容控制段落文字展开折叠效果
Aug 06 Javascript
HTML5之WebSocket入门3 -通信模型socket.io
Aug 21 Javascript
简单几步实现返回顶部效果
Dec 05 Javascript
Bootstrap下拉菜单样式
Feb 07 Javascript
Bootstrap栅格系统使用方法及页面调整变形的解决方法
Mar 10 Javascript
JavaScript中使用webuploader实现上传视频功能(demo)
Apr 10 Javascript
vue基于mint-ui的城市选择3级联动的示例
Oct 25 Javascript
浅谈webpack下的AOP式无侵入注入
Nov 12 Javascript
JS+H5 Canvas实现时钟效果
Jul 20 Javascript
JS跨域请求的问题解析
Dec 03 Javascript
微信小程序scroll-view不能左右滑动问题的解决方法
Jul 09 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
PHP中文件读、写、删的操作(PHP中对文件和目录操作)
2012/03/06 PHP
PHP中array_map与array_column之间的关系分析
2014/08/19 PHP
php实现的支持断点续传的文件下载类
2014/09/23 PHP
PHP中如何防止外部恶意提交调用ajax接口
2016/04/11 PHP
实例分析PHP中PHPMailer发邮件
2017/12/13 PHP
Laravel框架自定义验证过程实例分析
2019/02/01 PHP
使用CSS3实现字体颜色渐变的实现
2021/03/09 HTML / CSS
用户注册常用javascript代码
2009/08/29 Javascript
jquery ajax执行后台方法
2010/03/18 Javascript
精通Javascript系列之数值计算
2011/06/07 Javascript
js querySelector和getElementById通过id获取元素的区别
2012/04/20 Javascript
公共js在页面底部加载的注意事项介绍
2013/07/18 Javascript
在父页面调用子页面的JS方法
2013/09/29 Javascript
Bootstrap每天必学之前端开发框架
2015/11/19 Javascript
判断数组是否包含某个元素的js函数实现方法
2016/05/19 Javascript
AngularJS监听路由的变化示例代码
2016/09/23 Javascript
vue使用中的内存泄漏【推荐】
2018/07/10 Javascript
JS 实现微信扫一扫功能
2018/09/14 Javascript
如何优雅地在vue中添加权限控制示例详解
2019/03/07 Javascript
微信小程序--获取用户地理位置名称(无须用户授权)的方法
2019/04/29 Javascript
解决vue axios跨域 Request Method: OPTIONS问题(预检请求)
2020/08/14 Javascript
Vue 的 v-model用法实例
2020/11/23 Vue.js
[05:16]《大圣!大圣》——DOTA2新英雄齐天大圣配音李世宏老师专访
2016/12/13 DOTA
Linux上使用Python统计每天的键盘输入次数
2019/04/17 Python
Tkinter中复选菜单是否被选中的判断与设置方式
2020/03/04 Python
python 中的9个实用技巧,助你提高开发效率
2020/08/30 Python
python实现canny边缘检测
2020/09/14 Python
浅析Python中字符串的intern机制
2020/10/03 Python
python绘图pyecharts+pandas的使用详解
2020/12/13 Python
美国排名第一的在线葡萄酒商店:Wine.com
2016/09/07 全球购物
Nike德国官网:Nike.com (DE)
2018/11/13 全球购物
递归实现回文判断(如:abcdedbca就是回文,判断一个面试者对递归理解的简单程序)
2013/04/28 面试题
编辑找工作求职信范文
2013/12/16 职场文书
学校周年庆活动方案
2014/08/22 职场文书
从事会计工作年限证明
2015/06/23 职场文书
HR必备:销售经理聘用合同范本
2019/08/21 职场文书