理解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 判断数组是否已包含了某个元素的函数
May 30 Javascript
关于JS管理作用域的问题
Apr 10 Javascript
利用进制转换压缩数字函数分享
Jan 02 Javascript
初识Node.js
Mar 20 Javascript
js手动播放图片实现图片轮播效果
Sep 17 Javascript
AngularJS动态加载模块和依赖的方法分析
Nov 08 Javascript
AngularJs表单验证实例代码解析
Nov 29 Javascript
vue-cli入门之项目结构分析
Apr 20 Javascript
jQuery动画_动力节点节点Java学院整理
Jul 04 jQuery
js实现多张图片延迟加载效果
Jul 17 Javascript
详解js根据百度地图提供经纬度计算两点距离
May 13 Javascript
小程序表单认证布局及验证详解
Jun 19 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 获取本机外网/公网IP的代码
2010/05/09 PHP
ThinkPHP之M方法实例详解
2014/06/20 PHP
php遍历删除整个目录及文件的方法
2015/03/13 PHP
php自动加载方式集合
2016/04/04 PHP
php使用pear_smtp发送邮件
2016/04/15 PHP
PHP添加PNG图片背景透明水印操作类定义与用法示例
2019/03/12 PHP
php7 错误处理机制修改实例分析
2020/05/25 PHP
非常好的js代码
2006/06/27 Javascript
懒就要懒到底——鼠标自动点击(含时间判断)
2007/02/20 Javascript
JS仿flash上传头像效果实现代码
2011/07/18 Javascript
JavaScript中访问节点对象的方法有哪些如何使用
2013/09/24 Javascript
extjs 时间范围选择自动判断的实现代码
2014/06/24 Javascript
动态载入js提高网页打开速度的方法
2014/07/04 Javascript
浅谈javascript对象模型和function对象
2014/12/26 Javascript
jQuery添加和删除指定标签的方法
2015/12/16 Javascript
jQuery简单实现iframe的高度根据页面内容自适应的方法
2016/08/01 Javascript
AngularJs  unit-testing(单元测试)详解
2016/09/02 Javascript
深入理解vue中的$set
2017/06/01 Javascript
JavaScript canvas绘制折线图
2020/02/18 Javascript
vue3.0 自适应不同分辨率电脑的操作
2021/02/06 Vue.js
[59:08]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第一局
2016/02/27 DOTA
python创建只读属性对象的方法(ReadOnlyObject)
2013/02/10 Python
Python中用函数作为返回值和实现闭包的教程
2015/04/27 Python
Python正则表达式分组概念与用法详解
2017/06/24 Python
微信跳一跳游戏python脚本
2020/04/01 Python
python之mock模块基本使用方法详解
2019/06/27 Python
利用Python脚本批量生成SQL语句
2020/03/04 Python
Pycharm2020.1安装中文语言插件的详细教程(不需要汉化)
2020/08/07 Python
ProBikeKit新西兰:自行车套件,跑步和铁人三项装备
2017/04/05 全球购物
澳洲国民品牌乡村路折扣店:Country Road & Trenery Outlet
2018/04/19 全球购物
在印度上传处方,在线订购药品:Medlife
2019/03/28 全球购物
新闻专业推荐信范文
2013/11/20 职场文书
家庭教育先进个人事迹材料
2014/01/24 职场文书
公司管理建议书范文
2014/03/12 职场文书
2019学校运动会开幕词
2019/05/13 职场文书
一篇文章告诉你如何实现Vue前端分页和后端分页
2022/02/18 Vue.js