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 bind 函数 使用闭包保存执行上下文
Dec 26 Javascript
Android中的jQuery:AQuery简介
May 06 Javascript
javascript中 try catch用法
Aug 16 Javascript
深入理解jQuery layui分页控件的使用
Aug 17 Javascript
vue中vee validate表单校验的几种基本使用
Jun 25 Javascript
Vue使用vue-area-linkage实现地址三级联动效果的示例
Jun 27 Javascript
JQueryDOM之样式操作
Mar 27 jQuery
基于Vue.js与WordPress Rest API构建单页应用详解
Sep 16 Javascript
小程序如何自主实现拦截器的示例代码
Nov 04 Javascript
Vue路由 重定向和别名的区别说明
Sep 09 Javascript
JavaScript canvas实现跟随鼠标移动小球
Feb 09 Javascript
如何用JS实现网页瀑布流布局
Apr 24 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
人大复印资料处理程序_补充篇
2006/10/09 PHP
使用PHP函数scandir排除特定目录
2014/06/12 PHP
php中header设置常见文件类型的content-type
2015/06/23 PHP
优化WordPress的Google字体以加速国内服务器上的运行
2015/11/24 PHP
PHP curl模拟登录带验证码的网站
2015/11/30 PHP
PHP开发中常用的十个代码样例
2016/02/02 PHP
基于php解决json_encode中文UNICODE转码问题
2020/11/10 PHP
JavaScript 函数调用规则
2009/09/14 Javascript
Javascript 判断Flash是否加载完成的代码
2010/04/12 Javascript
JavaScript模板入门介绍
2012/09/26 Javascript
.net,js捕捉文本框回车键事件的小例子(兼容多浏览器)
2013/03/11 Javascript
Javascript浮点数乘积运算出现多位小数的解决方法
2014/02/17 Javascript
node.js中的emitter.emit方法使用说明
2014/12/10 Javascript
详解JavaScript ES6中的Generator
2015/07/28 Javascript
JavaScript基本语法学习教程
2016/01/14 Javascript
关于JSON与JSONP简单总结
2016/08/16 Javascript
纯JavaScript手写图片轮播代码
2016/10/20 Javascript
angularjs $http调用接口的方式详解
2018/08/13 Javascript
vue mounted 调用两次的完美解决办法
2018/10/29 Javascript
js逆向解密之网络爬虫
2019/05/30 Javascript
Python求解平方根的方法
2015/03/11 Python
Python 实现链表实例代码
2017/04/07 Python
解决DataFrame排序sort的问题
2018/06/07 Python
python使用turtle绘制分形树
2018/06/22 Python
python获取磁盘号下盘符步骤详解
2019/06/19 Python
python切片(获取一个子列表(数组))详解
2019/08/09 Python
Python利用WMI实现ping命令的例子
2019/08/14 Python
Python测试框架:pytest学习笔记
2020/10/20 Python
药学专业大学生个人的自我评价
2013/11/04 职场文书
技能比赛获奖感言
2014/02/14 职场文书
带病坚持工作事迹
2014/05/03 职场文书
2014年大学班长工作总结
2014/11/14 职场文书
2016年春季趣味运动会开幕词
2016/03/04 职场文书
python requests模块的使用示例
2021/04/07 Python
SpringMVC 整合SSM框架详解
2021/08/30 Java/Android
一文简单了解MySQL前缀索引
2022/04/03 MySQL