理解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 相关文章推荐
jquery mobile页面跳转后样式丢失js失效的解决方法
Sep 06 Javascript
jQuery访问浏览器本地存储cookie、localStorage和sessionStorage的基本用法
Oct 20 jQuery
百度地图去掉marker覆盖物或者去掉maker的label文字方法
Jan 26 Javascript
关于Webpack dev server热加载失败的解决方法
Feb 22 Javascript
vue-devtools的安装步骤
Apr 23 Javascript
vue1.0和vue2.0的watch监听事件写法详解
Sep 11 Javascript
vue 使用vue-i18n做全局中英文切换的方法
Oct 29 Javascript
JQuery样式操作、click事件以及索引值-选项卡应用示例
May 14 jQuery
使用Bootstrap做一个朝代历史表
Dec 10 Javascript
npx create-react-app xxx创建项目报错的解决办法
Feb 17 Javascript
js实现简易计算器小功能
Nov 18 Javascript
JavaScript使用canvas绘制坐标和线
Apr 28 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
PHP原生模板引擎 最简单的模板引擎
2012/04/25 PHP
php中使用接口实现工厂设计模式的代码
2012/06/17 PHP
php递归创建目录的方法
2015/02/02 PHP
浅谈PHP中关于foreach使用引用变量的坑
2016/11/14 PHP
详解PHP字符串替换str_replace()函数四种用法
2017/10/13 PHP
基于jquery实现状态限定编辑的代码
2012/02/11 Javascript
js 高效去除数组重复元素示例代码
2013/12/19 Javascript
手机平板等移动端适配跳转URL的js代码
2014/01/25 Javascript
用js提交表单解决一个页面有多个提交按钮的问题
2014/09/01 Javascript
jQuery鼠标经过方形图片切换成圆边效果代码分享
2015/08/20 Javascript
Vue 父子组件的数据传递、修改和更新方法
2018/03/01 Javascript
vue.js内置组件之keep-alive组件使用
2018/07/10 Javascript
angularjs手动识别字符串中的换行符方法
2018/10/02 Javascript
JavaScript中的this/call/apply/bind的使用及区别
2020/03/06 Javascript
小程序分享链接onShareAppMessage的具体用法
2020/05/22 Javascript
Vue触发input选取文件点击事件操作
2020/08/07 Javascript
[08:07]DOTA2每周TOP10 精彩击杀集锦vol.8
2014/06/25 DOTA
[43:32]Winstrike vs VGJ.S 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
python 美化输出信息的实例
2018/10/15 Python
对pandas中iloc,loc取数据差别及按条件取值的方法详解
2018/11/06 Python
python3 实现对图片进行局部切割的方法
2018/12/05 Python
python multiprocessing模块用法及原理介绍
2019/08/20 Python
Python自动化完成tb喵币任务的操作方法
2019/10/30 Python
python 在sql语句中使用%s,%d,%f说明
2020/06/06 Python
萨克斯第五大道精品百货店: Saks Fifth Avenue
2017/04/28 全球购物
雅萌 (YA-MAN) :日本美容家电领域的龙头企业
2017/05/12 全球购物
The North Face北面英国官网:美国著名户外品牌
2017/12/13 全球购物
SkinCeuticals官网:美国药妆品牌
2018/04/19 全球购物
全球领先的全景影像品牌:Insta360
2019/08/21 全球购物
社区法制宣传日活动总结
2015/05/05 职场文书
驳回起诉裁定书
2015/05/19 职场文书
2015年教研员工作总结
2015/05/26 职场文书
矛盾论读书笔记
2015/06/29 职场文书
Flutter Navigator 实现路由传递参数
2022/04/22 Java/Android
鲲鹏 CentOS 7 安装Python3.7
2022/05/11 Servers
mysql全面解析json/数组
2022/07/07 MySQL