理解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 相关文章推荐
google地图的路线实现代码
Aug 20 Javascript
利用jQuery的deferred对象实现异步按顺序加载JS文件
Mar 17 Javascript
Canvas + JavaScript 制作图片粒子效果
Feb 08 Javascript
微信小程序商城项目之淘宝分类入口(2)
Apr 17 Javascript
微信小程序新增的拖动组件movable-view使用教程
May 20 Javascript
在vue中,v-for的索引index在html中的使用方法
Mar 06 Javascript
vue-cli 组件的导入与使用教程详解
Apr 11 Javascript
教你如何用node连接redis的示例代码
Jul 12 Javascript
vue-cli3.0使用及部分配置详解
Aug 29 Javascript
详解JavaScript的数据类型以及数据类型的转换
Apr 20 Javascript
记一次vue跨域的解决
Oct 21 Javascript
使用原生javascript开发计算器实例代码
Feb 21 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
在Windows版的PHP中使用ADO
2006/10/09 PHP
常见php数据文件缓存类汇总
2014/12/05 PHP
php+mysqli数据库连接的两种方式
2015/01/28 PHP
PHP序列化/对象注入漏洞分析
2016/04/18 PHP
php生成网页桌面快捷方式
2017/05/05 PHP
PHP容器类的两种实现方式示例
2019/07/24 PHP
dojo 之基础篇(二)之从服务器读取数据
2007/03/24 Javascript
Underscore.js 的模板功能介绍与应用
2012/12/24 Javascript
js中Math之random,round,ceil,floor的用法总结
2013/12/26 Javascript
js表单处理中单选、多选、选择框值的获取及表单的序列化
2016/03/08 Javascript
JavaScript如何实现图片懒加载(lazyload) 提高用户体验(增强版)
2016/11/30 Javascript
快速掌握jQuery插件开发
2017/01/19 Javascript
jQuery插件zTree实现获取当前选中节点在同级节点中序号的方法
2017/03/08 Javascript
vue中倒计时组件的实例代码
2018/07/06 Javascript
vue使用v-for实现hover点击效果
2018/09/29 Javascript
Three.JS实现三维场景
2018/12/30 Javascript
Vue+Vuex实现自动登录的知识点详解
2020/03/04 Javascript
vue 二维码长按保存和复制内容操作
2020/09/22 Javascript
[44:40]KG vs LGD 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
Python数据结构与算法之字典树实现方法示例
2017/12/13 Python
教你使用python实现微信每天给女朋友说晚安
2018/03/23 Python
python读取和保存视频文件
2018/04/16 Python
python 实现将字典dict、列表list中的中文正常显示方法
2018/07/06 Python
pytest中文文档之编写断言
2019/09/12 Python
Python 使用 prettytable 库打印表格美化输出功能
2019/12/26 Python
python字符串下标与切片及使用方法
2020/02/13 Python
CSS3 :default伪类选择器使用简介
2018/03/15 HTML / CSS
华三通信H3C面试题
2015/05/15 面试题
美术指导求职信
2014/03/17 职场文书
保密承诺书
2014/03/27 职场文书
查摆剖析材料范文
2014/09/30 职场文书
质监局领导班子践行群众路线整改方案
2014/10/26 职场文书
2014年设备管理工作总结
2014/11/26 职场文书
英语通知范文
2015/04/22 职场文书
2015年度企业工作总结
2015/05/21 职场文书
mysql定时自动备份数据库的方法步骤
2021/07/07 MySQL