理解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 相关文章推荐
js showModalDialog 弹出对话框的简单实例(子窗体)
Jan 07 Javascript
javascript调试之DOM断点调试法使用技巧分享
Apr 15 Javascript
js获取select默认选中的Option并不是当前选中值
May 07 Javascript
深入理解JavaScript系列(36):设计模式之中介者模式详解
Mar 04 Javascript
学习JavaScript设计模式之装饰者模式
Jan 19 Javascript
Vue数组更新及过滤排序功能
Aug 10 Javascript
jQuery实现轮播图及其原理详解
Apr 12 jQuery
vscode下vue项目中eslint的使用方法
Jan 13 Javascript
使用vue-router在Vue页面之间传递数据的方法
Jul 15 Javascript
vuex存值与取值的实例
Nov 06 Javascript
JavaScript单线程和任务队列原理解析
Feb 04 Javascript
js实现无刷新监听URL的变化示例代码详解
Jun 03 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相当简单的分页类
2008/10/02 PHP
PHP 开发环境配置(Zend Server安装)
2010/04/28 PHP
如何把php5.3版本升级到php5.4或者php5.5
2015/07/31 PHP
php给图片加文字水印
2015/07/31 PHP
Javascript 中文字符串处理额外注意事项
2009/11/15 Javascript
ajax 缓存 问题 requestheader
2010/08/01 Javascript
JQuery文本框高亮显示插件代码
2011/04/02 Javascript
分享js粘帖屏幕截图到web页面插件screenshot-paste
2020/08/21 Javascript
JavaScript几种数组去掉重复值的方法推荐
2016/04/12 Javascript
JavaScript中获取HTML元素值的三种方法
2016/06/20 Javascript
详解jQuery中关于Ajax的几个常用的函数
2017/07/17 jQuery
Vue CLI 3搭建vue+vuex最全分析(推荐)
2018/09/27 Javascript
浅谈针对Vue相同路由不同参数的刷新问题
2018/09/29 Javascript
Vue 实现CLI 3.0 + momentjs + lodash打包时优化
2019/11/13 Javascript
微信小程序淘宝首页双排图片布局排版代码(推荐)
2020/10/29 Javascript
Vue用mixin合并重复代码的实现
2020/11/27 Vue.js
Python实现telnet服务器的方法
2015/07/10 Python
Python数据类型详解(一)字符串
2016/05/08 Python
python生成excel的实例代码
2017/11/08 Python
python3结合openpyxl库实现excel操作的实例代码
2018/09/11 Python
python自动化生成IOS的图标
2018/11/13 Python
Python简单基础小程序的实例代码
2019/04/28 Python
Python3内置模块之base64编解码方法详解
2019/07/13 Python
python pygame实现挡板弹球游戏
2019/11/25 Python
Python代码执行时间测量模块timeit用法解析
2020/07/01 Python
联想香港官方网站及网店:Lenovo香港
2018/04/13 全球购物
如何通过jdbc调用存储过程
2012/04/19 面试题
中医专业职业生涯规划书范文
2014/01/04 职场文书
档案检查欢迎词
2014/01/13 职场文书
仓库规划计划书
2014/04/28 职场文书
项目负责人任命书
2014/06/04 职场文书
安全横幅标语
2014/06/09 职场文书
祖国在我心中演讲稿200字
2014/08/28 职场文书
新娘婚礼答谢词
2015/09/29 职场文书
在前女友婚礼上,用Python破解了现场的WIFI还把名称改成了
2021/05/28 Python
MySQL如何解决幻读问题
2021/08/07 MySQL