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 Tab选项卡效果代码改进版
Apr 01 Javascript
JavaScript中把数字转换为字符串的程序代码
Jun 19 Javascript
Knockout visible绑定使用方法
Nov 15 Javascript
javascript数组去重方法终极总结
Jun 05 Javascript
JavaScript获得页面base标签中url的方法
Apr 03 Javascript
javascript中select下拉框的用法总结
Jan 07 Javascript
javascript每日必学之基础入门
Feb 16 Javascript
bootstrap模态框消失问题的解决方法
Dec 02 Javascript
jQuery表格(Table)基本操作实例分析
Mar 10 Javascript
微信小程序实现简单input正则表达式验证功能示例
Nov 30 Javascript
Vue中 v-if/v-show/插值表达式导致闪现的原因及解决办法
Oct 12 Javascript
jQuery事件blur()方法的使用实例讲解
Mar 30 jQuery
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你的验证码安全码?
2007/01/02 PHP
使用ThinkPHP自带的Http类下载远程图片到本地的实现代码
2011/08/02 PHP
PHP中$_SERVER的详细参数与说明介绍
2013/10/26 PHP
10款PHP开源商城系统汇总介绍
2015/07/23 PHP
php 常用的系统函数
2017/02/07 PHP
Javascript - HTML的request类
2007/01/09 Javascript
JS 页面内容搜索,类似于 Ctrl+F功能的实现代码
2007/08/13 Javascript
JavaScript 继承的实现
2009/07/09 Javascript
javascript限制文本框只允许输入数字(曾经与现在的方法对比)
2013/01/18 Javascript
jquery 动态创建元素的方式介绍及应用
2013/04/21 Javascript
js实现页面转发功能示例代码
2013/08/05 Javascript
javascript中几个容易混淆的概念总结
2015/04/14 Javascript
js实现3D图片逐张轮播幻灯片特效代码分享
2015/09/09 Javascript
JavaScript正则表达式的分组匹配详解
2016/02/13 Javascript
JavaScript中循环遍历Array与Map的方法小结
2016/03/12 Javascript
基于JavaScript实现轮播图代码
2016/07/14 Javascript
JS实现图文并茂的tab选项卡效果示例【附demo源码下载】
2016/09/21 Javascript
node.js缺少mysql模块运行报错的解决方法
2016/11/13 Javascript
jsTree使用记录实例
2016/12/01 Javascript
微信小程序使用modal组件弹出对话框功能示例
2017/11/29 Javascript
从零开始用webpack构建一个vue3.0项目工程的实现
2020/09/24 Javascript
jQuery实现电梯导航模块
2020/12/22 jQuery
[07:08]2014DOTA2西雅图国际邀请赛 小组赛7月11日TOPPLAY
2014/07/11 DOTA
学习python处理python编码问题
2011/03/13 Python
Python base64编码解码实例
2015/06/21 Python
Python快速排序算法实例分析
2017/11/29 Python
python适合人工智能的理由和优势
2019/06/28 Python
通过python实现随机交换礼物程序详解
2019/07/10 Python
python实现的发邮件功能示例
2019/09/11 Python
python中怎么表示空值
2020/06/19 Python
物流管理专业毕业生求职信
2014/03/23 职场文书
行政部经理助理岗位职责
2014/06/15 职场文书
党的群众路线教育实践活动总结报告
2014/07/03 职场文书
法律意见书范文
2015/05/20 职场文书
Python实战之大鱼吃小鱼游戏的实现
2022/04/01 Python
使用ICOM IC-R9500接收机同时测评十台收音机中波接收性能
2022/05/10 无线电