理解Javascript_02_理解undefined和null


Posted in Javascript onOctober 11, 2010

来自普遍的回答:
其实在 ECMAScript 的原始类型中,是有Undefined 和 Null 类型的。 这两种类型都分别对应了属于自己的唯一专用值,即undefined 和 null。
值 undefined 实际上是从值 null 派生来的,因此 ECMAScript 把它们定义为相等的,通过下列代码可以验证这一结论:
alert(undefined == null); //true

尽管这两个值相等,但它们的含义不同。
undefined 是声明了变量但未对其初始化时赋予该变量的值,null 则用于表示尚未存在的对象。如果函数或方法要返回的是对象,那么找不到该对象时,返回的通常是 null。
所以alert(undefined===null);//false

说实话,我没有看明白,为什么undefined会继承null,即然是继承那为什么undefined!==null,还有未初始化的变量与函数返回的对象不存在之间有什么区别,问题种种,让人很不信服。

看看内存是怎么说的:
Udefined代表没有赋值的基本数据类型。
Null代表没有赋值的引用数据类型。
我们来看一段代码:

var age; 
var id = 100; 
var div02 = document.getElementById("div02");//注:div02是不存在的 
var div01 = document.getElementById("div01");//注:div01存在 
alert(id);//100 
alert(age);//undefined 
alert(div02);//null 
alert(div01);//object

再来看一下内存的情况:
理解Javascript_02_理解undefined和null
解决第一个问题:为什么undefine继承自null

在Javascript中,基本数据类型都有一个与其对应的引用数据类型,number Number,string String,boolean Boolean...,他们具有完全相同的行为,并且相互之间会产生自动拆箱与装箱的操作。在内存分析一文中已经讲述了基本数据类型放在栈内存中的意义,由此这们可以得出一个肤浅的结论:基本数据类型是对应引用数据类型的子类,只不过是为了提高效率,将其放在栈内存中而已,对应的Undefined代表无值的基本类型,Null代表无值的引用类型,那势必就可以推出undefined继承null。

解决第二个问题:为什么undefined==null

推出来的答案undefined继承自null,内存告诉我们的答案他们都处于栈中

解决第三个问题:为什么undefined!==null

内存告诉我们,它们的意义确实是不一样的,老话一句:Udefined代表没有赋值的基本数据类型,Null代表没有赋值的引用数据类型。他们的内存图有很大的区别

解决额外的问题:null是处理引用的,为什么null处在栈内存中,而不是堆内存中

答案一样的简单,效率!有必要在栈中分配一块额外的内存去指向堆中的null吗!

额外的收获:

当我们要切断与对象的联系,但又并不想给变量赋于其他的值,那么我们可了置null,如var obj = new Object();obj=null;

一些关于undefined和null的行为

null 参与数值运算时其值会自动转换为 0 ,因此,下列表达式计算后会得到正确的数值:

表达式:123 + null

结果值:123

typeof null 返回object,因为null代表是无值的引用。

undefined是全局对象(window)的一个特殊属性,其值为Undefined类型的专用值undefined

undefined参与任何数值计算时,其结果一定是NaN。

当声明的变量未初始化时,该变量的默认值是undefined,但是undefined并不同于未定义的值。Typeof运算符无法区分这两种值

因此对于变量是否存在的判断操作是通过if(typeof var == ‘undefined'){ //code here } 来进行判断的,这样既完全兼容未定义(undefined)和未初始化(uninitialized)两种情况的

哈哈,当你站在内存的高度的分析问题的时候,如此抽象的东西有了实际的表现,一切变得简单起来!

Javascript 相关文章推荐
Windows Live的@live.com域名注册漏洞 利用代码
Dec 27 Javascript
javascript 学习之旅 (3)
Feb 05 Javascript
精心挑选的15款优秀jQuery 本特效插件和教程
Aug 06 Javascript
JavaScript执行顺序详细介绍
Dec 04 Javascript
灵活的理解JavaScript中的this指向
Feb 25 Javascript
原生JS实现旋转木马式图片轮播插件
Apr 25 Javascript
Vue.js实现一个自定义分页组件vue-paginaiton
Sep 05 Javascript
jquery+Jscex打造游戏力度条
Sep 12 Javascript
AngularJS双向数据绑定原理之$watch、$apply和$digest的应用
Jan 30 Javascript
JavaScript多态与封装实例分析
Jul 27 Javascript
Express结合Webpack的全栈自动刷新
May 23 Javascript
JavaScript 截取字符串代码实例
Sep 05 Javascript
理解Javascript_01_理解内存分配原理分析
Oct 11 #Javascript
javascript getElementsByClassName实现代码
Oct 11 #Javascript
javascript Array.prototype.slice使用说明
Oct 11 #Javascript
javascript 伪数组实现方法
Oct 11 #Javascript
javascript forEach通用循环遍历方法
Oct 11 #Javascript
JavaScript 操作键盘的Enter事件(键盘任何事件),兼容多浏览器
Oct 11 #Javascript
JavaScript isArray()函数判断对象类型的种种方法
Oct 11 #Javascript
You might like
MySQL相关说明
2007/01/15 PHP
CI框架验证码CAPTCHA辅助函数用法实例
2014/11/05 PHP
php判断用户是否手机访问代码
2015/06/08 PHP
Thinkphp无限级分类代码
2015/11/11 PHP
PHP按一定比例压缩图片的方法
2018/10/12 PHP
PHP开发api接口安全验证操作实例详解
2020/03/26 PHP
MacOS下PHP7.1升级到PHP7.4.15的方法
2021/02/22 PHP
解决jQuery插件tipswindown与hintbox冲突
2010/11/05 Javascript
jquery load()在firefox(火狐)下显示不正常的解决方法
2011/04/05 Javascript
25个优雅的jQuery Tooltip插件推荐
2011/05/25 Javascript
JS中setInterval、setTimeout不能传递带参数的函数的解决方案
2013/04/28 Javascript
将input file的选择的文件清空的两种解决方案
2013/10/21 Javascript
jquery批量设置属性readonly和disabled的方法
2014/01/24 Javascript
AngularJS入门教程之AngularJS模型
2016/04/18 Javascript
JS如何生成一个不重复的ID的函数
2016/12/25 Javascript
基于jQuery插件jqzoom实现的图片放大镜效果示例
2017/01/23 Javascript
详解Vue.js入门环境搭建
2017/03/17 Javascript
vue.js事件处理器是什么
2017/03/20 Javascript
vue监听滚动事件实现滚动监听
2017/04/11 Javascript
JS实现多级菜单中当前菜单不随页面跳转样式而发生变化
2017/05/30 Javascript
微信小程序地图(map)组件点击(tap)获取经纬度的方法
2019/01/10 Javascript
Vue+Koa2+mongoose写一个像素绘板的实现方法
2019/09/10 Javascript
JS使用for in有序获取对象数据
2020/05/19 Javascript
vue路由结构可设一层方便动态添加路由操作
2020/08/31 Javascript
Array.filter中如何正确使用Async
2020/11/04 Javascript
举例讲解Python中装饰器的用法
2015/04/27 Python
Python实现的简单算术游戏实例
2015/05/26 Python
python开发之tkinter实现图形随鼠标移动的方法
2015/11/11 Python
前后端结合实现amazeUI分页效果
2020/08/21 HTML / CSS
英国家喻户晓的高街品牌:River Island
2017/11/28 全球购物
追悼会上的答谢词
2014/01/10 职场文书
儿媳婚宴答谢词
2014/01/14 职场文书
教师党员岗位承诺书
2014/05/29 职场文书
工作总结与自我评价
2014/09/18 职场文书
Nginx配置80端口访问8080及项目名地址方法解析
2021/03/31 Servers
MySQL连接控制插件介绍
2021/09/25 MySQL