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 相关文章推荐
让Firefox支持event对象实现代码
Nov 07 Javascript
jQuery+CSS实现菜单滑动伸展收缩(仿淘宝)
Mar 22 Javascript
JS+flash实现chrome和ie浏览器下同时可以复制粘贴
Sep 22 Javascript
让alert不出现弹窗的两种方法
May 18 Javascript
JavaScript实现三阶幻方算法谜题解答
Dec 29 Javascript
js密码强度校验
Nov 10 Javascript
D3.js实现柱状图的方法详解
Sep 21 Javascript
实现隔行换色效果的两种方式【实用】
Nov 27 Javascript
详解AngularJS 模块化
Jun 14 Javascript
Vue.js进阶知识点总结
Apr 01 Javascript
解决v-for中使用v-if或者v-bind:class失效的问题
Sep 25 Javascript
javascript实现切割轮播效果
Nov 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
绿山咖啡和蓝山咖啡
2021/03/04 新手入门
PHP中设置时区方法小结
2012/06/03 PHP
PHP易混淆函数的区别及用法汇总
2014/11/22 PHP
浅谈PHP面向对象之访问者模式+组合模式
2017/05/22 PHP
用JavaScript实现仿Windows关机效果
2007/03/10 Javascript
js 键盘记录实现(兼容FireFox和IE)
2010/02/07 Javascript
html中使用javascript调用本地程序(exe、doc等)实现代码
2013/04/26 Javascript
nodejs 中模拟实现 emmiter 自定义事件
2016/02/22 NodeJs
jquery 中toggle的2种用法详解(推荐)
2016/09/02 Javascript
JavaScript数据结构链表知识详解
2016/11/21 Javascript
jQuery实现判断控件是否显示的方法
2017/01/11 Javascript
js实现漫天星星效果
2017/01/19 Javascript
详解JavaScript RegExp对象
2017/02/04 Javascript
Vue.js 2.0学习教程之从基础到组件详解
2017/04/24 Javascript
angular4实现tab栏切换的方法示例
2017/10/21 Javascript
vue-cli webpack2项目打包优化分享
2018/02/07 Javascript
vue中$set的使用(结合在实际应用中遇到的坑)
2018/07/10 Javascript
从源码里了解vue中的nextTick的使用
2018/11/22 Javascript
详解React服务端渲染从入门到精通
2019/03/28 Javascript
vue+element实现表格新增、编辑、删除功能
2019/05/28 Javascript
[15:23]教你分分钟做大人:虚空假面
2014/10/30 DOTA
[01:36]极致酷炫!TI9典藏宝瓶+撼地者至宝展示
2019/06/11 DOTA
朴素贝叶斯算法的python实现方法
2014/11/18 Python
python判断字符串是否包含子字符串的方法
2015/03/24 Python
flask使用session保存登录状态及拦截未登录请求代码
2018/01/19 Python
flask框架使用orm连接数据库的方法示例
2018/07/16 Python
django-rest-framework 自定义swagger过程详解
2019/07/18 Python
PyCharm第一次安装及使用教程
2020/01/08 Python
大学运动会通讯稿
2014/01/28 职场文书
小学校园广播稿(3篇)
2014/09/19 职场文书
网络营销计划
2015/01/17 职场文书
党员读书活动心得体会
2016/01/14 职场文书
家庭教育教师培训学习体会
2016/01/14 职场文书
2016年质量月活动总结报告
2016/04/05 职场文书
python库sklearn常用操作
2021/08/23 Python
mysql性能优化以及配置连接参数设置
2022/05/06 MySQL