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 相关文章推荐
读jQuery之六 缓存数据功能介绍
Jun 21 Javascript
jquery中.add()的使用分析
Apr 26 Javascript
jquery select 设置默认选中的示例代码
Feb 07 Javascript
浅析javascript中function 的 length 属性
May 27 Javascript
javascript判断移动端访问设备并解析对应CSS的方法
Feb 05 Javascript
jQuery实现自动与手动切换的滚动新闻特效代码分享
Aug 27 Javascript
跟我学习javascript的函数和函数表达式
Nov 16 Javascript
详解javascript表单的Ajax提交插件的使用
Dec 29 Javascript
jQuery实现select下拉框获取当前选中文本、值、索引
May 08 jQuery
VUE实现表单元素双向绑定(总结)
Aug 08 Javascript
vue 打包后的文件部署到express服务器上的方法
Aug 09 Javascript
vue-router 起步步骤详解
Mar 26 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的openssl加密扩展使用小结(推荐)
2016/07/18 PHP
php将html转为图片的实现方法
2017/05/19 PHP
jQuery插件 tabBox实现代码
2010/02/09 Javascript
JavaScript字符串String和Array操作的有趣方法
2012/12/18 Javascript
js调用css属性写法
2013/09/21 Javascript
js改变鼠标的形状和样式的方法
2014/03/31 Javascript
jQuery基于ajax实现带动画效果无刷新柱状图投票代码
2015/08/10 Javascript
使用基于Node.js的构建工具Grunt来发布ASP.NET MVC项目
2016/02/15 Javascript
BootStrap实用代码片段之一
2016/03/22 Javascript
Bootstrap组件(一)之菜单
2016/05/11 Javascript
Bootstrap+jfinal实现省市级联下拉菜单
2016/05/30 Javascript
jquery树形菜单效果的简单实例
2016/06/06 Javascript
Nodejs从有门道无门菜鸟起飞必看教程
2016/07/20 NodeJs
node.js连接MongoDB数据库的2种方法教程
2017/05/17 Javascript
js删除数组中的元素delete和splice的区别详解
2018/02/03 Javascript
VUE搭建手机商城心得和遇到的坑
2019/02/21 Javascript
微信小程序实现圆形进度条动画
2020/11/18 Javascript
解决vue项目,npm run build后,报路径错的问题
2020/08/13 Javascript
Python记录详细调用堆栈日志的方法
2015/05/05 Python
Python线性方程组求解运算示例
2018/01/17 Python
Python中的heapq模块源码详析
2019/01/08 Python
Python实现的IP端口扫描工具类示例
2019/02/15 Python
python3.7简单的爬虫实例详解
2019/07/08 Python
Python3从零开始搭建一个语音对话机器人的实现
2019/08/23 Python
wxPython实现画图板
2020/08/27 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
2020/11/17 Python
CSS3 绘制BMW logo实的现代码
2013/04/25 HTML / CSS
移动端HTML5实现文件上传功能【附代码】
2016/03/25 HTML / CSS
Beach Bunny Swimwear官网:设计师泳装和性感比基尼
2019/03/13 全球购物
公司市场部岗位职责
2013/12/02 职场文书
程序员求职信
2014/04/16 职场文书
项目经理任命书内容
2014/06/06 职场文书
2014业务员年终工作总结
2014/12/09 职场文书
餐饮食品安全责任书
2015/01/29 职场文书
python之PySide2安装使用及QT Designer UI设计案例教程
2021/07/26 Python
Win11怎么进入安全模式?Windows 11进入安全模式的方法
2021/11/21 数码科技