理解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 相关文章推荐
JavaScript入门之对象与JSON详解
Oct 21 Javascript
javascript与cookie 的问题详解
Nov 11 Javascript
JS,Jquery获取select,dropdownlist,checkbox下拉列表框的值(示例代码)
Jan 11 Javascript
JavaScript中的Math.SQRT1_2属性使用简介
Jun 14 Javascript
JS实现密码框根据焦点的获取与失去控制文字的消失与显示效果
Nov 26 Javascript
JS实现多张图片预览同步上传功能
Jun 23 Javascript
jQuery基于随机数解决中午吃什么去哪吃问题示例
Dec 29 jQuery
详解vue-cli3开发Chrome插件实践
May 29 Javascript
JavaScript的Proxy可以做哪些有意思的事儿
Jun 15 Javascript
JavaScript实现与web通信的方法详解
Aug 07 Javascript
js实现删除json中指定的元素
Sep 22 Javascript
vue导入.md文件的步骤(markdown转HTML)
Dec 31 Vue.js
理解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
php循环输出数据库内容的代码
2008/05/24 PHP
apache+php完美解决301重定向的两种方法
2011/06/08 PHP
一个完整的php文件上传类实例讲解
2015/10/27 PHP
PHP中函数gzuncompress无法使用的解决方法
2017/03/02 PHP
Yii框架扩展CGridView增加导出CSV功能的方法
2017/05/24 PHP
PHP实现的redis主从数据库状态检测功能示例
2017/07/20 PHP
js 模拟实现类似c#下的hashtable的简单功能代码
2010/01/24 Javascript
解决3.01版的jquery.form.js中文乱码问题的解决方法
2012/03/08 Javascript
jQuery 1.7.2中getAll方法的疑惑分析
2012/05/23 Javascript
如何屏蔽防止别的网站嵌入框架代码
2015/08/24 Javascript
基于JavaScript实现TAB标签效果
2016/01/12 Javascript
jQuery实现标签页效果实战(4)
2017/02/08 Javascript
JS实现的全排列组合算法示例
2017/10/09 Javascript
解决vuecli3中img src 的引入问题
2020/08/04 Javascript
js实现限定区域范围拖拉拽效果
2020/11/20 Javascript
[05:26]2014DOTA2西雅图国际邀请赛 iG战队巡礼
2014/07/07 DOTA
Python自动登录126邮箱的方法
2015/07/10 Python
Python编程之字符串模板(Template)用法实例分析
2017/07/22 Python
Python编程深度学习绘图库之matplotlib
2018/12/28 Python
使用Django连接Mysql数据库步骤
2019/01/15 Python
理想高通滤波实现Python opencv示例
2019/01/30 Python
基于Python获取照片的GPS位置信息
2020/01/20 Python
解决Pycharm双击图标启动不了的问题(JetBrains全家桶通用)
2020/08/07 Python
Python 求向量的余弦值操作
2021/03/04 Python
几个CSS3的flex弹性盒模型布局的简单例子演示
2016/05/12 HTML / CSS
详解canvas drawImage()方法绘制图片不显示的问题
2018/10/08 HTML / CSS
意大利奢华内衣制造商:Cosabella
2017/08/29 全球购物
AT&T Wireless:手机、无限数据计划和配件
2018/06/03 全球购物
销售找工作求职信
2013/12/20 职场文书
大学生职业生涯规划书
2014/03/14 职场文书
2014年度个人工作总结
2014/11/07 职场文书
总经理助理岗位职责范本
2015/03/31 职场文书
2015年党风建设工作总结
2015/04/29 职场文书
惊天动地观后感
2015/06/10 职场文书
Golang二维切片初始化的实现
2021/04/08 Golang
python opencv检测直线 cv2.HoughLinesP的实现
2021/06/18 Python