JavaScript null和undefined区别分析


Posted in Javascript onOctober 14, 2009

一时间不好回答,特别是undefined,因为这涉及到undefined的实现原理。于是,细想之后,写下本文,请各位大侠拍砖。
总所周知:null == undefined
但是:null !== undefined
那么这两者到底有啥区别呢?
请听俺娓娓道来...
null
这是一个对象,但是为空。因为是对象,所以 typeof null 返回 'object' 。
null 是 JavaScript 保留关键字。
null 参与数值运算时其值会自动转换为 0 ,因此,下列表达式计算后会得到正确的数值:
表达式:123 + null

结果值:123
表达式:123 * null

结果值:0
undefined
undefined是全局对象(window)的一个特殊属性,其值是未定义的。但 typeof undefined 返回 'undefined' 。
虽然undefined是有特殊含义的,但它确实是一个属性,而且是全局对象(window)的属性。请看下面的代码:

alert('undefined' in window);//输出:true 
var anObj = {}; 
alert('undefined' in anObj); //输出:false

从中可以看出,undefined是window对象的一个属性,但却不是anObj对象的一个属性。
注意:尽管undefined是有特殊含义的属性,但却不是JavaScript的保留关键字。
undefined参与任何数值计算时,其结果一定是NaN。
随便说一下,NaN是全局对象(window)的另一个特殊属性,Infinity也是。这些特殊属性都不是JavaScript的保留关键字!
提高undefined性能
当我们在程序中使用undefined值时,实际上使用的是window对象的undefined属性。
同样,当我们定义一个变量但未赋予其初始值,例如:
var aValue;
这时,JavaScript在所谓的预编译时会将其初始值设置为对window.undefined属性的引用,
于是,当我们将一个变量或值与undefined比较时,实际上是与window对象的undefined属性比较。这个比较过程中,JavaScript会搜索window对象名叫‘undefined'的属性,然后再比较两个操作数的引用指针是否相同。
由于window对象的属性值是非常多的,在每一次与undefined的比较中,搜索window对象的undefined属性都会花费时 间。在需要频繁与undefined进行比较的函数中,这可能会是一个性能问题点。因此,在这种情况下,我们可以自行定义一个局部的undefined变 量,来加快对undefined的比较速度。例如:
function anyFunc() { 
var undefined; 
//自定义局部undefined变量 
if(x == undefined) 
//作用域上的引用比较 
while(y != undefined) 
//作用域上的引用比较 
};

其中,定义undefined局部变量时,其初始值会是对window.undefined属性值的引用。新定义的局部undefined变 量存在与该函数的作用域上。在随后的比较操作中,JavaScript代码的书写方式没有任何的改变,但比较速度却很快。因为作用域上的变量数量会远远少 于window对象的属性,搜索变量的速度会极大提高。
这就是许多前端JS框架为什么常常要自己定义一个局部undefined变量的原因!
Javascript 相关文章推荐
Array.prototype.slice 使用扩展
Jun 09 Javascript
safari,opera嵌入iframe页面cookie读取问题解决方法
Jun 23 Javascript
js中访问html中iframe的文档对象的代码[IE6,IE7,IE8,FF]
Jan 08 Javascript
基于jQuery的星级评分插件
Aug 12 Javascript
多次注册事件会导致一个事件被触发多次的解决方法
Aug 12 Javascript
jquery.cookie用法详细解析
Dec 18 Javascript
js实现checkbox全选和反选示例
May 01 Javascript
es6学习笔记之Async函数基本教程
May 11 Javascript
vue根据进入的路由进行原路返回的方法
Sep 26 Javascript
JavaScript使用闭包模仿块级作用域操作示例
Jan 21 Javascript
vue工程全局设置ajax的等待动效的方法
Feb 22 Javascript
解决vue项目打包上服务器显示404错误,本地没出错的问题
Nov 03 Javascript
JavaScript iframe的相互操作浅析
Oct 14 #Javascript
使用jQuery简化Ajax开发 Ajax开发入门
Oct 14 #Javascript
jQuery技巧大放送 学习jquery的朋友可以看下
Oct 14 #Javascript
JS+XML 省份和城市之间的联动实现代码
Oct 14 #Javascript
jquery 常用操作整理 基础入门篇
Oct 14 #Javascript
一些技巧性实用js代码小结
Oct 14 #Javascript
Jquery 学习笔记(一)
Oct 13 #Javascript
You might like
完美解决PHP中文乱码
2009/11/26 PHP
CodeIgniter基于Email类发邮件的方法
2016/03/29 PHP
[原创]php求圆周率的简单实现方法
2016/05/30 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
2020/02/21 PHP
prototype class详解
2006/09/07 Javascript
js实现权限树的更新权限时的全选全消功能
2009/02/17 Javascript
当json键为数字时的取值方法解析
2013/11/15 Javascript
逐一介绍Jquery data()、Jquery stop()、jquery delay()函数(详)
2015/11/04 Javascript
Bootstrap精简教程
2015/11/27 Javascript
javascript的document中的动态添加标签实现方法
2016/10/24 Javascript
JavaScript中捕获与冒泡详解及实例
2017/02/03 Javascript
jQuery选取所有复选框被选中的值并用Ajax异步提交数据的实例
2017/08/04 jQuery
使用Dropzone.js上传的示例代码
2017/10/10 Javascript
详解Vue路由钩子及应用场景(小结)
2017/11/07 Javascript
3分钟了解vue数据劫持的原理实现
2019/05/01 Javascript
微信小程序用户授权弹窗 拒绝时引导用户重新授权实现
2019/07/29 Javascript
layui的layedit富文本赋值方法
2019/09/18 Javascript
Vertx基于EventBus发送接受自定义对象
2020/11/16 Javascript
vue动态合并单元格并添加小计合计功能示例
2020/11/26 Vue.js
[03:08]Ti4观战指南上
2014/07/07 DOTA
[04:31]2016国际邀请赛中国区预选赛妖精采访
2016/06/27 DOTA
[03:16]DOTA2完美大师赛小组赛精彩集锦
2017/11/22 DOTA
Python实现计算文件夹下.h和.cpp文件的总行数
2015/04/23 Python
Python 3中的yield from语法详解
2017/01/18 Python
Python利用itchat对微信中好友数据实现简单分析的方法
2017/11/21 Python
如何利用python之wxpy模块玩转微信
2020/08/17 Python
python pyg2plot的原理知识点总结
2021/02/28 Python
纯CSS3大转盘抽奖示例代码(响应式、可配置)
2017/01/13 HTML / CSS
极简的HTML5模版
2015/07/09 HTML / CSS
Sephora丝芙兰印尼官方网站:购买化妆品和护肤品
2018/07/02 全球购物
公司人力资源的自我评价
2014/01/02 职场文书
写给学生的新学期寄语
2014/01/18 职场文书
运动会广播稿30字
2014/01/21 职场文书
2015年教务处干事工作总结
2015/07/22 职场文书
python爬虫之爬取笔趣阁小说
2021/04/22 Python
高考要来啦!用Python爬取历年高考数据并分析
2021/06/03 Python