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 相关文章推荐
些很实用且必用的小脚本代码
Jun 26 Javascript
jQuery dialog 异步调用ashx,webservice数据的代码
Aug 03 Javascript
document.forms[].submit()使用介绍
Feb 19 Javascript
JavaScript函数的4种调用方法详解
Apr 22 Javascript
JavaScript:Array类型全面解析
May 19 Javascript
js判断空对象的实例(超简单)
Jul 26 Javascript
详解JavaScript中的属性和特性
Dec 08 Javascript
AngularJS Toaster使用详解
Feb 24 Javascript
JS实现520 表白简单代码
May 21 Javascript
如何用webpack4带你实现一个vue的打包的项目
Jun 20 Javascript
Element input树型下拉框的实现代码
Dec 21 Javascript
详解ng-alain动态表单SF表单项设置必填和正则校验
Jun 11 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/10/09 PHP
967 个函式
2006/10/09 PHP
php学习之简单计算器实现代码
2011/06/09 PHP
php session劫持和防范的方法
2013/11/12 PHP
ThinkPHP CURD方法之data方法详解
2014/06/18 PHP
Drupal简体中文语言包安装教程
2014/09/27 PHP
PHP通过CURL实现定时任务的图片抓取功能示例
2016/10/03 PHP
php ajax数据传输和响应方法
2018/08/21 PHP
改变隐藏的input中value的值代码
2013/12/30 Javascript
JavaScript实现两个Table固定表头根据页面大小自行调整
2014/01/03 Javascript
js弹窗返回值详解(window.open方式)
2014/01/11 Javascript
HTML中setCapture、releaseCapture 使用方法浅析
2016/09/25 Javascript
微信小程序  自定义创建详细介绍
2016/10/27 Javascript
详解Angular-Cli中引用第三方库
2017/05/21 Javascript
浅谈angular2路由预加载策略
2017/10/04 Javascript
Angular移动端页面input无法输入的解决方法
2017/11/14 Javascript
Babel 入门教程学习笔记
2018/06/13 Javascript
微信小程序实现登录遮罩效果
2018/11/01 Javascript
使用webpack将ES6转化ES5的实现方法
2019/10/13 Javascript
关于Python的一些学习总结
2018/05/25 Python
Python3爬虫爬取百姓网列表并保存为json功能示例【基于request、lxml和json模块】
2018/12/05 Python
实时获取Python的print输出流方法
2019/01/07 Python
Python面向对象程序设计构造函数和析构函数用法分析
2019/04/12 Python
Python OpenCV读取中文路径图像的方法
2020/07/02 Python
实现CSS3中的border-radius(边框圆角)示例代码
2013/07/19 HTML / CSS
秘鲁购物网站:Linio秘鲁
2017/04/07 全球购物
汇集了世界上最好的天然和有机美容产品:LoveLula
2018/02/05 全球购物
高级运动鞋:GREATS
2019/07/19 全球购物
PHP面试题-$message和$$message的区别
2015/12/08 面试题
收银员的岗位职责范本
2014/02/04 职场文书
护理毕业生自我鉴定
2014/02/11 职场文书
课内比教学心得体会
2014/09/09 职场文书
安全责任协议书范本
2016/03/23 职场文书
SQL Server连接查询的实用教程
2021/04/07 SQL Server
python爬取网页版QQ空间,生成各类图表
2021/06/02 Python
浅谈Golang 切片(slice)扩容机制的原理
2021/06/09 Golang