开发者社区> 文艺小青年> 正文

理解undefined和null

简介:
+关注继续查看

来自普遍的回答:

其实在 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代表没有赋值的引用数据类型。

我们来看一段代码:

1 var age;
2 var id = 100;
3 var div02 = document.getElementById("div02");//注:div02是不存在的
4 var div01 = document.getElementById("div01");//注:div01存在
5 alert(id);//100
6 alert(age);//undefined
7 alert(div02);//null
8 alert(div01);//object

再来看一下内存的情况:

解决第一个问题:为什么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)两种情况的

 

哈哈,当你站在内存的高度的分析问题的时候,如此抽象的东西有了实际的表现,一切变得简单起来!

 

-----------------------------更新 2010/11/01 --------------------------------------------

undefined与参数判断

我们行来看一个简单的函数:

1 function bool(val){
2        if(typeof val == 'undefined'){
3             return true;
4         }
5         return !!val;
6 }

这个函数有问题吗?有,因为typeof返回undefined值有两种可能,一种是传进来的就是undefined,还有一种是没有传值。

1 alert(bool(undefined));//true
2 alert(bool());//true

 

很明显,bool(undefined)返回了不是我们所期望的false.怎么解决这个问题呢?

1 function bool(val){
2     if(arguments.length !==0){
3         return !!val;
4     }
5     return true;   
6 }

我们通过arguments参数长度来判断是否传递了参数,从而区分函数传递的参数是undefined,还是根本不就没有传值! 


本文转自艾伦 Aaron博客园博客,原文链接:http://www.cnblogs.com/aaronjs/archive/2011/09/05/2167513.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
undefined vs null
undefined vs null 如何产生undefined和null Null 判断运算符(??)的默认值 [es2020] undefined 和 null 没有任何属性 undefined 和 null的历史
30 0
解决办法:look up error: undefined symbol
解决办法:look up error: undefined symbol
89 0
Cannot resolve symbol 'R' 解决的几种方法
Cannot resolve symbol 'R' 解决的几种方法
140 0
报错:loaderContext.getResolve is not a function
报错:loaderContext.getResolve is not a function
52 0
TypeError: this.getOptions is not a function at Object.lessLoader
TypeError: this.getOptions is not a function at Object.lessLoader
67 0
关于"symbol lookup error xxxxx , undefined symbol"问题的解决方式
​ 今天在测试基于netlib实现的数据包处理模块时,突然提示symbollookup error gxio_mpipe_init , undefined symbol问题。通过查阅资料对于该问题大部分的问题原因都是动态库的版本过旧,导致应用程序找不到对应的符号而引起的。
471 0
你真的理解==和===的区别吗?
用中文怎么叫合适? 相等?全等?
58 0
为什么用 void 0 代替 undefined?
为什么用 void 0 代替 undefined?
217 0
typeof的用法和注意点
typeof的用法和注意点
116 0
2、null, undefined 和布尔值
null与undefined都可以表示“没有”,含义非常相似。
79 0
JavaScript event.preventDefault和return false
JavaScript event.preventDefault和return false
69 0
Call to undefined function openssl_get_privatekey()
错误说明:   调用未定义的函数openssl_get_privatekey 处理方案:     打开php.ini文件   ctrl+F 查找 extension=php_openssl.dll   去掉前面的分号   重启服务。
492 0
JS中判断null、undefined与NaN的方法
JS中判断null、undefined与NaN的方法 1.判断undefined: 说明:typeof 返回的是字符串,有六种可能: "number"、"string"、"boolean"、"object"、"function"、"undefined" /* 1.
992 0
ES6 箭头函数: () => {} 与匿名函数 function() {}
function foo() { setTimeout( () => { console.log("id:", this.id); },100); } foo.
1419 0
+关注
文艺小青年
文章
问答
视频
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载