Undefined与Null的区别

一、基本数据类型

在介绍undefined与null之前,我们先来了解一下ECMAScript中的数据类型。在ECMAScript中有六种简单数据类型(也称为基本数据类型): Undefined、Null、Boolean、Number 和 String、Symbol (ES6中引入) 。还有一种复杂数据类型——Object。

Undefined和Null都只有一个值,分别对应着undefined和null。这两种不同类型的值,既有着不同的语义和场景,又表现出较为相似的行为。

二、undefined

undefined 的字面意思就是:未定义的值 。这个值的语义是,希望表示一个变量最原始的状态,而非人为操作的结果 。 这种原始状态会在以下 4 种场景中出现:

1、声明一个变量,但是没有赋值

var foo;
console.log(foo); // undefined
复制代码

访问 foo,返回了 undefined,表示这个变量自从声明了以后,就从来没有使用过,也没有定义过任何有效的值。

2、访问对象上不存在的属性或者未定义的变量

console.log(Object.foo); // undefined
console.log(typeof demo); // undefined
复制代码

访问 Object 对象上的 foo 属性,返回 undefined , 表示Object 上不存在或者没有定义名为 foo 的属性;对未声明的变量执行typeof操作符返回了undefined值。

3、函数定义了形参,但没有传递实参

//函数定义了形参 a
function fn(a) {console.log(a); // undefined
}
fn(); //未传递实参
复制代码

函数 fn 定义了形参 a,但 fn 被调用时没有传递参数,因此,fn 运行时的参数 a 就是一个原始的、未被赋值的变量。

4、使用void对表达式求值

void 0 ; // undefined
void false; // undefined
void []; // undefined
void null; // undefined
void function fn(){} ; // undefined
复制代码

ECMAScript 明确规定 void 操作符 对任何表达式求值都返回 undefined ,这和函数执行操作后没有返回值的作用是一样的,JavaScript 中的函数都有返回值,当没有 return 操作时,就默认返回一个原始的状态值,这个值就是 undefined,表明函数的返回值未被定义。

因此,undefined 一般都来自于某个表达式最原始的状态值,不是人为操作的结果。当然,你也可以手动给一个变量赋值 undefined,但这样做没有意义,因为一个变量不赋值就是 undefined 。

三、null

null 的字面意思是:空值 。这个值的语义是,希望表示一个对象被人为的重置为空对象,而非一个变量最原始的状态 。 在内存里的表示就是,栈中的变量没有指向堆中的内存对象。

1、一般在以下两种情况下我们会将变量赋值为null

  • 如果定义的变量在将来用于保存对象,那么最好将该变量初始化为null,而不是其他值。换句话说,只要意在保存对象的变量还没有真正保存对象,就应该明确地让该变量保存null值,这样有助于进一步区分null和undefined。

  • 当一个数据不再需要使用时,我们最好通过将其值设置为null来释放其引用,这个做法叫做解除引用。不过解除一个值的引用并不意味着自动回收改值所占用的内存。解除引用的真正作用是让值脱离执行环境,以便垃圾收集器在下次运行时将其回收。解除引用还有助于消除有可能出现的循环引用的情况。这一做法适用于大多数全局变量和全局对象的属性,局部变量会在它们离开执行环境时(函数执行完时)自动被解除引用。

2、特殊的typeof null

当我们使用typeof操作符检测null值,我们理所应当地认为应该返"Null"类型呀,但是事实返回的类型却是"object"。

var data = null;
console.log(typeof data); // "object"
复制代码

是不是很奇怪?其实我们可以从两方面来理解这个结果:

  • 一方面从逻辑角度来看,null值表示一个空对象指针,它代表的其实就是一个空对象,所以使用typeof操作符检测时返回"object"也是可以理解的。

  • 另一方面,其实在JavaScript 最初的实现中,JavaScript 中的值是由一个表示类型的标签和实际数据值表示的(对象的类型标签是 0)。由于 null 代表的是空指针(大多数平台下值为 0x00),因此,null的类型标签也成为了 0,typeof null就错误的返回了"object"。在ES6中,当时曾经有提案为历史平凡, 将type null的值纠正为null, 但最后提案被拒了,所以还是保持"object"类型。

四、总结

用一句话总结两者的区别就是:undefined 表示一个变量自然的、最原始的状态值,而 null 则表示一个变量被人为的设置为空对象,而不是原始状态。所以,在实际使用过程中,为了保证变量所代表的语义,不要对一个变量显式的赋值 undefined,当需要释放一个对象时,直接赋值为 null 即可。

Undefined与Null的区别相关推荐

  1. 下班前几分钟,我彻底弄懂了 undefined 和 null 的区别

    目录 前言 一.基本概念 1.undefined 2.null 二.简单区别 三.表现形式 1.typeof 2.== 与 === 3.Object.prototype.toString.call 4 ...

  2. JS基础之undefined与null的区别

    在JavaScript开发中,被人问到:null与undefined到底有啥区别? 一时间不好回答,特别是undefined,因为这涉及到undefined的实现原理.于是,细想之后,写下本文,请各位 ...

  3. undefined 和null的区别?

    null是一个表示"无"的对象,转为数值时为0:undefined是一个表示"无"的原始值,转为数值时为NaN. undefined: (1)变量被声明了,但没 ...

  4. JS中undefined和null的区别,以及出现原因

    区别:null是一个表示无的对象,转换为数值为0: undefined表示一个无的原始值,转化为数值为NAN(与任何数字相加也为NAN) undefined出现原因:(口诀:一变量二函数一对象) 1. ...

  5. 你知道undefined与null的区别吗?

    转载于:https://www.cnblogs.com/shiweihappy/p/4246448.html

  6. java Null==undefined_javascript中的undefined和null有什么区别

    原标题:javascript中的undefined和null有什么区别 java中的undefined和null的区别有:类型不同前者返回的是未定义值后者是对象:转换原始类型方式不同前者是不支持转换后 ...

  7. 在JS中如何判断undefined和null

    不当用法 有时为了判断某个值有效,JS新手会写这种臃肿代码: if (data != null && typeof(data) != undefined && data ...

  8. [JS] undefined、null、ReferenceError的区别、变量作用域问题

    undefined.null.ReferenceError的区别 null表示"没有对象",即该处不应该有值. 典型用法是: (1) 作为函数的参数,表示该函数的参数不是对象. ( ...

  9. javascript中not defined、undefined、null以及NaN的区别

    [ 前言 ] 从踏入IT行业开始,我就发现技术人员写博客很有必要.如果不写博客,时间久了就像好比天天在外面建房子的人,没有一个自己的房子一样.不管学习紧不紧,工作忙不忙,多动手进行梳理总结,一方面是为 ...

  10. 前端小知识点(1):undefined和null区别

    目录 一.奇怪点 二.历史原因 三.具体区别 四.代码演示 五.运行结果 一.奇怪点 有点奇怪的是,JavaScript语言居然有两个表示"无"的值:undefined和null. ...

最新文章

  1. 图灵机与控制论之分歧,一切为了人类心智的荣耀!
  2. python自学平台-怎么自学python,大概要多久?
  3. 阿里笔试题—战报交流
  4. 应用jBPM4解决中国特色的流程需求 (看过之后,强烈推荐)
  5. 喜报!中华万年历签约神策数据
  6. php中数组下标,PHP数组介绍_php
  7. testmeshpro合批_TextMesh Pro Emoji Align With Text(表情和文字对齐)
  8. WinAPI: 钩子回调函数之 CallWndProcRetProc
  9. ZooKeeper官方文档学习笔记01-zookeeper概述
  10. Windows核心编程_PE文件格式详细介绍
  11. 27. PHP 文件创建/写入
  12. easyswoole验证码的使用
  13. 中国智慧停车行业未来前景展望及项目运营规模咨询报告2021-2027年
  14. php微信公众号登录
  15. Kubernetes 管理员认证(CKA)考试笔记(二)
  16. peer channel create解析
  17. 利用ip138取得公网IP,公网ip改变后报警通知我们进行更改
  18. Android Studio升级到3.5之后xml格式化问题
  19. 邮件营销 – 电子邮件营销的20个技巧
  20. JS实现答题上一题下一题

热门文章

  1. 淘宝API 优惠券查询
  2. 彰显互联网基因:大数据引发互联网原创综艺革新。。
  3. ·「笔记」安装composer -- 安装phpspreadsheet
  4. 算法之 --- 背包01版+ 挖金矿问题
  5. 原厂PL7203大电流3A充电IC
  6. appium ios端自动化测试配置
  7. 计算机专业 论文检索,如何检索计算机专业论文文献
  8. 好程序员分享面向对象概念的理解以及ES3和ES6中类的写法
  9. 【人工智能行业大师访谈4】吴恩达采访Yoshua Bengio
  10. mysql数据库安装过程蜿蜒曲折