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 相关文章推荐
你的编程语言可以这样做吗?
Sep 07 Javascript
Javascript下的keyCode键码值表
Apr 10 Javascript
JQuery跨Iframe选择实现代码
Aug 19 Javascript
JavaScript操作HTML DOM节点的基础教程
Mar 11 Javascript
全面接触神奇的Bootstrap导航条实战篇
Aug 01 Javascript
JavaScript面向对象分层思维全面解析
Nov 22 Javascript
Bootstrap学习笔记之环境配置(1)
Dec 07 Javascript
浅谈 Vue v-model指令的实现原理
Jun 08 Javascript
vue中当图片地址无效的时候,显示默认图片的方法
Sep 18 Javascript
Vue中UI组件库之Vuex与虚拟服务器初识
May 07 Javascript
浅谈layui分页控件field参数接收对象的问题
Sep 20 Javascript
ES6如何用一句代码实现函数的柯里化
Jan 18 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弹出提示框并跳转到新页面即重定向到新页面
2014/01/24 PHP
php实现批量修改文件名称的方法
2016/07/23 PHP
让你的PHP,APACHE,NGINX支持大文件上传
2021/03/09 PHP
40个新鲜出炉的jQuery 插件和免费教程[上]
2012/07/24 Javascript
js 获取坐标 通过JS得到当前焦点(鼠标)的坐标属性
2013/01/04 Javascript
js中的scroll和offset 使用比较的实例与分析
2013/09/29 Javascript
JavaScript程序员应该知道的45个实用技巧
2014/03/04 Javascript
js数组与字符串的相互转换方法
2014/07/09 Javascript
jQuery元素的隐藏与显示实例
2015/01/20 Javascript
JavaScript中创建字典对象(dictionary)实例
2015/03/31 Javascript
Bootstrap下拉菜单样式
2017/02/07 Javascript
layui中layer前端组件实现图片显示功能的方法分析
2017/10/13 Javascript
WebSocket的通信过程与实现方法详解
2018/04/29 Javascript
vue-property-decorator用法详解
2019/12/12 Javascript
Node中对非阻塞I/O、事件循环的知识点总结
2020/01/05 Javascript
js实现三角形粒子运动
2020/09/22 Javascript
python海龟绘图实例教程
2014/07/24 Python
Python实现简单的文件传输与MySQL备份的脚本分享
2016/01/03 Python
python 3.5下xadmin的使用及修复源码bug
2017/05/10 Python
Python3.6简单操作Mysql数据库
2017/09/12 Python
python+pyqt实现12306图片验证效果
2017/10/25 Python
python 获取字符串MD5值方法
2018/05/29 Python
python+webdriver自动化环境搭建步骤详解
2019/06/03 Python
对DJango视图(views)和模版(templates)的使用详解
2019/07/17 Python
详解python如何引用包package
2020/06/07 Python
详解Pymongo常用查询方法总结
2021/01/29 Python
Hanky Panky官方网站:内衣和睡衣
2019/07/25 全球购物
vue路由实现登录拦截
2021/03/24 Vue.js
编辑找工作求职信范文
2013/12/16 职场文书
《列夫托尔斯泰》教学反思
2014/02/10 职场文书
项目申请汇报材料
2014/08/16 职场文书
毕业设计论文致谢词
2015/05/14 职场文书
2015年工会工作总结范文
2015/07/23 职场文书
使用Vue3+Vant组件实现App搜索历史记录功能(示例代码)
2021/06/09 Vue.js
Ruby序列化和持久化存储 Marshal和Pstore介绍
2022/04/18 Ruby
Python循环之while无限迭代
2022/04/30 Python