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 相关文章推荐
js几个验证函数代码
Mar 25 Javascript
javascript两种function的定义介绍及区别说明
May 02 Javascript
js调用打印机打印网页字体总是缩小一号的解决方法
Jan 24 Javascript
jquery动态更换设置背景图的方法
Mar 25 Javascript
JavaScript link方法入门实例(给字符串加上超链接)
Oct 17 Javascript
jQuery向webApi提交post json数据
Jan 16 Javascript
浅谈JavaScript异步编程
Jan 20 Javascript
详解使用webpack构建多页面应用
Dec 21 Javascript
LayUI表格批量删除方法
Aug 15 Javascript
vue1.0和vue2.0的watch监听事件写法详解
Sep 11 Javascript
详解Vue3.0 前的 TypeScript 最佳入门实践
Jun 18 Javascript
用Javascript实现发送短信验证码间隔功能
Feb 08 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
ThinkPHP3.2.3数据库设置新特性
2015/03/05 PHP
php实现字符串首字母大写和单词首字母大写的方法
2015/03/14 PHP
PHP对象链式操作实现原理分析
2016/10/09 PHP
浅谈php数组array_change_key_case() 函数和array_chunk()函数
2016/10/22 PHP
thinkphp5 URL和路由的功能详解与实例
2017/12/26 PHP
Save a File Using a File Save Dialog Box
2007/06/18 Javascript
Safari5中alert的无限循环BUG
2011/04/07 Javascript
js 第二代身份证号码的验证机制代码
2011/05/12 Javascript
javascript实现数独解法
2015/03/14 Javascript
JS动态修改iframe高度和宽度的方法
2015/04/01 Javascript
jQuery+css3实现Ajax点击后动态删除功能的方法
2015/08/10 Javascript
详解Vue微信授权登录前后端分离较为优雅的解决方案
2018/06/29 Javascript
vue+express 构建后台管理系统的示例代码
2018/07/19 Javascript
vue-cli 引入jQuery,Bootstrap,popper的方法
2018/09/03 jQuery
angular6的响应式表单的实现
2018/10/10 Javascript
微信小程序的注册页面包含倒计时验证码、获取用户信息
2019/05/22 Javascript
谈谈IntersectionObserver懒加载的具体使用
2019/10/15 Javascript
go语言计算两个时间的时间差方法
2015/03/13 Python
使用Python的判断语句模拟三目运算
2015/04/24 Python
python实现下载pop3邮件保存到本地
2018/06/19 Python
Python读取数据集并消除数据中的空行方法
2018/07/12 Python
python生成1行四列全2矩阵的方法
2018/08/04 Python
Python提取频域特征知识点浅析
2019/03/04 Python
python函数定义和调用过程详解
2020/02/09 Python
如何利用python进行时间序列分析
2020/08/04 Python
用CSS3实现无限循环的无缝滚动的实例代码
2017/07/04 HTML / CSS
瑞典的玛丽小姐:Miss Mary of Sweden
2019/02/13 全球购物
澳大利亚最超值的自行车之家:Reid Cycles
2019/03/24 全球购物
js正则匹配markdown里的图片标签的实现
2021/03/24 Javascript
肯尼迪就职演说稿
2013/12/31 职场文书
公司保密承诺书
2014/03/27 职场文书
房屋委托书范本
2014/04/04 职场文书
中专生自荐信
2014/06/25 职场文书
市场总监岗位职责
2015/02/11 职场文书
2015年业务工作总结范文
2015/04/10 职场文书
匿名信格式范文
2015/05/27 职场文书