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 相关文章推荐
prototype 中文参数乱码解决方案
Nov 09 Javascript
DOM基础教程之事件类型
Jan 20 Javascript
angularJS中router的使用指南
Feb 09 Javascript
javascript实时显示当天日期的方法
May 20 Javascript
js实现Select列表内容自动滚动效果代码
Aug 20 Javascript
jQuery获取浏览器类型和版本号的方法
Jul 05 Javascript
浅谈Angularjs link和compile的使用区别
Oct 21 Javascript
JavaScript制作简易计算器(不用eval)
Feb 05 Javascript
JavaScript canvas实现围绕旋转动画
Nov 18 Javascript
基于Bootstrap下拉框插件bootstrap-select使用方法详解
Aug 07 Javascript
Angular动态绑定样式及改变UI框架样式的方法小结
Sep 03 Javascript
用node开发并发布一个cli工具的方法步骤
Jan 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
简单的页面缓冲技术
2006/10/09 PHP
彻底杜绝PHP的session cookie错误
2009/08/09 PHP
thinkPHP事务操作简单案例分析
2019/10/17 PHP
Web开发者必备的12款超赞jQuery插件
2010/12/03 Javascript
JS数学函数Exp使用说明
2012/08/09 Javascript
checkbox设置复选框的只读效果不让用户勾选
2013/08/12 Javascript
jquery ajax 局部刷新小案例
2014/02/08 Javascript
JavaScript中的函数重载深入理解
2014/08/04 Javascript
通过js为元素添加多项样式,浏览器全兼容写法
2014/08/30 Javascript
JS获取图片高度宽度的方法分享
2015/04/17 Javascript
简单实现异步编程promise模式
2015/07/31 Javascript
JavaScript接口的实现三种方式(推荐)
2016/06/14 Javascript
谈谈jQuery之Deferred源码剖析
2016/12/19 Javascript
基于jQuery实现左侧菜单栏可折叠功能
2016/12/27 Javascript
Vue.js系列之项目结构说明(2)
2017/01/03 Javascript
Vue+Element使用富文本编辑器的示例代码
2017/08/14 Javascript
快速搭建React的环境步骤详解
2017/11/06 Javascript
Vue.js与 ASP.NET Core 服务端渲染功能整合
2017/11/16 Javascript
Node.js Domain 模块实例详解
2020/03/18 Javascript
Python实现多线程下载文件的代码实例
2014/06/01 Python
python里对list中的整数求平均并排序
2014/09/12 Python
python如何通过protobuf实现rpc
2016/03/06 Python
python爬取m3u8连接的视频
2018/02/28 Python
Python设计模式之解释器模式原理与用法实例分析
2019/01/10 Python
11个Python3字典内置方法大全与示例汇总
2019/05/13 Python
set在python里的含义和用法
2019/06/24 Python
django中的图片验证码功能
2019/09/18 Python
利用setuptools打包python程序的方法步骤
2020/01/18 Python
Python实现封装打包自己写的代码,被python import
2020/07/12 Python
加拿大在线隐形眼镜专家:PerfectLens.ca
2016/11/19 全球购物
马来西亚在线时尚女装商店:KEI MAG
2017/09/28 全球购物
联想德国官网:Lenovo Germany
2018/07/04 全球购物
公益活动策划方案
2014/01/09 职场文书
企业员工集体活动方案
2014/08/17 职场文书
励志语录:只有自己足够强大,才能不被别人践踏
2020/01/09 职场文书
JavaScript流程控制(循环)
2021/12/06 Javascript