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 相关文章推荐
javascript parseInt 函数分析(转)
Mar 21 Javascript
JQuery对id中含有特殊字符的转义处理示例
Sep 06 Javascript
jQuery学习之prop和attr的区别示例介绍
Nov 15 Javascript
JavaScript关闭当前页面(窗口)不带任何提示
Mar 26 Javascript
判断日期是否能跨月查询的js代码
Jul 25 Javascript
js实现按钮控制图片360度翻转特效的方法
Feb 17 Javascript
js获取对象、数组的实际长度,元素实际个数的实现代码
Jun 08 Javascript
js判断所有表单项不为空则提交表单的实现方法
Sep 09 Javascript
Nuxt配合Node在实际生产中的应用详解
Aug 07 Javascript
JavaScript简单实现动态改变HTML内容的方法示例
Dec 25 Javascript
vue scroll滚动判断的实现(是否滚动到底部、滚动方向、滚动节流、获取滚动区域dom元素)
Jun 11 Javascript
帮你提高开发效率的JavaScript20个技巧
Jun 18 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
山进SANGEAN ATS-909X电路分析
2021/03/02 无线电
使用 eAccelerator加速PHP代码的目的
2007/03/16 PHP
php中文字符截取防乱码
2008/03/28 PHP
自定义session存储机制避免会话保持问题
2014/10/08 PHP
VPS中使用LNMP安装WordPress教程
2014/12/28 PHP
PHP中Session可能会引起并发问题
2015/06/26 PHP
php+html5实现无刷新图片上传教程
2016/01/22 PHP
tp5框架前台无限极导航菜单类实现方法分析
2020/03/29 PHP
基于ThinkPHP删除目录及目录文件函数
2020/10/28 PHP
Javascript-Mozilla和IE中的一个函数直接量的问题
2007/01/09 Javascript
css图片自适应大小
2007/11/28 Javascript
jQuery.Validate 使用笔记(jQuery Validation范例 )
2010/06/25 Javascript
Prototype源码浅析 String部分(四)之补充
2012/01/16 Javascript
使用AngularJS对路由进行安全性处理的方法
2015/06/18 Javascript
Angular中$cacheFactory的作用和用法实例详解
2016/08/19 Javascript
概述javascript在Google IE中的调试技巧
2016/11/24 Javascript
JS针对Array的各种操作汇总
2016/11/29 Javascript
JS实现线性表的链式表示方法示例【经典数据结构】
2017/04/11 Javascript
微信小程序基于高德地图查找位置并显示文字
2019/10/30 Javascript
JS实现随机抽选获奖者
2019/11/07 Javascript
小程序实现按下录音松开识别语音
2019/11/22 Javascript
javascript设计模式 ? 建造者模式原理与应用实例分析
2020/04/10 Javascript
[01:15:00]LGD vs Mineski Supermajor 胜者组 BO3 第一场 6.5
2018/06/06 DOTA
Python标准模块--ContextManager上下文管理器的具体用法
2017/11/27 Python
Python中staticmethod和classmethod的作用与区别
2018/10/11 Python
pandas取出重复数据的方法
2019/07/04 Python
Django中间件拦截未登录url实例详解
2019/09/03 Python
Python class的继承方法代码实例
2020/02/14 Python
CSS3教程(9):设置RGB颜色
2009/04/02 HTML / CSS
sort命令的作用和用法
2012/11/04 面试题
辩论赛主持词
2014/03/18 职场文书
行政专员岗位职责说明书
2014/09/01 职场文书
2014年人民警察入党思想汇报
2014/10/12 职场文书
巾帼标兵事迹材料
2014/12/26 职场文书
pytorch中的numel函数用法说明
2021/05/13 Python
kubernetes集群搭建Zabbix监控平台的详细过程
2022/07/07 Servers