JS基础之undefined与null的区别分析


Posted in Javascript onAugust 08, 2011

于是,细想之后,写下本文,请各位大侠拍砖。
总所周知:
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入门——事件切换之hover()方法应用介绍
Feb 05 Javascript
在javascript中如何得到中英文混合字符串的长度
Jan 17 Javascript
多种方法实现load加载完成后把图片一次性显示出来
Feb 19 Javascript
jQuery调用ajax请求的常见方法汇总
Mar 24 Javascript
HTML5+setCutomValidity()函数验证表单实例分享
Apr 24 Javascript
JS数字抽奖游戏实现方法
May 04 Javascript
AngularJS 依赖注入详解及示例代码
Aug 17 Javascript
PHP7新特性简述
Jun 11 Javascript
基于cropper.js封装vue实现在线图片裁剪组件功能
Mar 01 Javascript
微信小程序自定义弹窗wcPop插件
Nov 19 Javascript
Node.js 实现远程桌面监控的方法步骤
Jul 02 Javascript
JavaScript中document.activeELement焦点元素介绍
Nov 27 Javascript
jQuery的12招常用技巧分享
Aug 08 #Javascript
利用javascript的面向对象的特性实现限制试用期
Aug 04 #Javascript
jquery动态加载图片数据练习代码
Aug 04 #Javascript
jquery里的正则表达式说明
Aug 03 #Javascript
基于jQuery的图片剪切插件
Aug 03 #Javascript
jQuery + Flex 通过拖拽方式动态改变图片的代码
Aug 03 #Javascript
JavaScript 一道字符串分解的题目
Aug 03 #Javascript
You might like
PHP中,文件上传
2006/12/06 PHP
回答PHPCHINA上的几个问题:URL映射
2007/02/14 PHP
基于php冒泡排序算法的深入理解
2013/06/09 PHP
PHP防止图片盗用(盗链)的方法小结
2016/11/11 PHP
总结一些PHP中好用但又容易忽略的小知识
2017/06/02 PHP
详解PHP中curl_multi并发的实现
2020/06/08 PHP
JQuery 动画卷页 返回顶部 动画特效(兼容Chrome)
2010/02/15 Javascript
Javascript中的相等与不等运算
2010/04/25 Javascript
线路分流自动智能跳转代码,自动选择最快镜像网站(js)
2011/10/31 Javascript
JavaScript 基础篇(一)
2012/03/30 Javascript
js动态添加事件并可传参数示例代码
2013/10/21 Javascript
jquery live()重复绑定的解决方法介绍
2014/01/03 Javascript
JSONP跨域GET请求解决Ajax跨域访问问题
2014/12/31 Javascript
js跨域资源共享 基础篇
2016/07/02 Javascript
JavaScript 对象详细整理总结
2016/09/29 Javascript
js读取json文件片段中的数据实例
2017/03/09 Javascript
bootstrap table实现双击可编辑、添加、删除行功能
2017/09/27 Javascript
vue实现点击展开点击收起效果
2018/04/27 Javascript
Vue实现push数组并删除的例子
2019/11/01 Javascript
卸载vue2.0并升级vue_cli3.0的实例讲解
2020/02/16 Javascript
详解Webpack抽离第三方类库以及common解决方案
2020/03/30 Javascript
使用webpack5从0到1搭建一个react项目的实现步骤
2020/12/16 Javascript
[01:14:41]DOTA2-DPC中国联赛定级赛 iG vs Magma BO3第一场 1月8日
2021/03/11 DOTA
Python学习笔记之os模块使用总结
2014/11/03 Python
python切片及sys.argv[]用法详解
2018/05/25 Python
使用python脚本实现查询火车票工具
2018/07/19 Python
Python Opencv任意形状目标检测并绘制框图
2019/07/23 Python
python求最大公约数和最小公倍数的简单方法
2020/02/13 Python
用60行代码实现Python自动抢微信红包
2021/02/04 Python
html5教程画矩形代码分享
2013/12/04 HTML / CSS
巴西美妆购物网站:Kutiz Beauté
2019/03/13 全球购物
工程造价与财务管理专业应届生求职信
2013/10/06 职场文书
计算机专业职业生涯规划范文
2014/01/19 职场文书
高中家长寄语
2014/04/02 职场文书
环卫工人节活动总结
2014/08/29 职场文书
初中语文教学研修日志
2015/11/13 职场文书