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 相关文章推荐
IE7提供XMLHttpRequest对象为兼容
Mar 08 Javascript
一些Javascript的IE和Firefox(火狐)兼容性的问题总结及常用例子
May 21 Javascript
jQuery中ajax和post处理json的不同示例对比
Nov 02 Javascript
Node.js中HTTP模块与事件模块详解
Nov 14 Javascript
XML、HTML、CSS与JS的区别整理
Feb 18 Javascript
JavaScript仿flash遮罩动画效果
Jun 15 Javascript
jQuery 3.0十大新特性最终版发布
Jul 14 Javascript
angular之ng-template模板加载
Nov 09 Javascript
vue中如何使用ztree
Feb 06 Javascript
vue 解决遍历对象显示的顺序不对问题
Nov 07 Javascript
Javascript基于OOP实实现探测器功能代码实例
Aug 26 Javascript
使用react-virtualized实现图片动态高度长列表的问题
May 28 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 smarty模版引擎中变量操作符及使用方法
2009/12/11 PHP
PHP获取数组中重复最多的元素的实现方法
2014/11/11 PHP
php实现按天数、星期、月份查询的搜索框
2016/05/02 PHP
PHP 将数组打乱 shuffle函数的用法及简单实例
2016/06/17 PHP
PHP中md5()函数的用法讲解
2019/03/30 PHP
[JS源码]超长文章自动分页(客户端版)
2007/01/09 Javascript
全国省市二级联动下拉菜单 js版
2016/05/10 Javascript
Jquery on方法绑定事件后执行多次的解决方法
2016/06/02 Javascript
bootstrap3 dialog 更强大、更灵活的模态框
2017/04/20 Javascript
jquery点赞功能实现代码 点个赞吧!
2020/05/29 jQuery
easyui datagrid 表格中操作栏 按钮图标不显示的解决方法
2017/07/27 Javascript
红黑树的插入详解及Javascript实现方法示例
2018/03/26 Javascript
Vue中JS动画与Velocity.js的结合使用
2019/02/13 Javascript
vue-cli 3 全局过滤器的实例代码详解
2019/06/03 Javascript
JsonProperty 的使用方法详解
2019/10/11 Javascript
vue 页面回退mounted函数不执行的解决方案
2020/07/26 Javascript
Python3实现爬取简书首页文章标题和文章链接的方法【测试可用】
2018/12/11 Python
python获取本机所有IP地址的方法
2018/12/26 Python
python从子线程中获得返回值的方法
2019/01/30 Python
Python使用MyQR制作专属动态彩色二维码功能
2019/06/04 Python
python ChainMap的使用和说明详解
2019/06/11 Python
python的re模块使用方法详解
2019/07/26 Python
python 实现汉诺塔游戏
2020/11/28 Python
世界领先的豪华床上用品供应商之一:Bedeck Home
2019/03/18 全球购物
初级软件工程师面试题 Junior Software Engineer Interview
2015/02/15 面试题
性能测试工程师的面试题
2015/02/20 面试题
见习期自我鉴定
2013/11/07 职场文书
新郎父亲婚宴答谢词
2014/01/11 职场文书
大学生的创业计划书就该这么写
2014/01/30 职场文书
幼儿园教师教学反思
2014/02/06 职场文书
工程质量月活动方案
2014/02/19 职场文书
一体化教学实施方案
2014/05/10 职场文书
2014年冬季防火方案
2014/05/21 职场文书
2014年四风问题自我剖析材料
2014/09/15 职场文书
在SQL Server中使用 Try Catch 处理异常的示例详解
2022/07/15 SQL Server
基于Python实现西西成语接龙小助手
2022/08/05 Golang