Undefined与Null的区别
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的区别相关推荐
- 下班前几分钟,我彻底弄懂了 undefined 和 null 的区别
目录 前言 一.基本概念 1.undefined 2.null 二.简单区别 三.表现形式 1.typeof 2.== 与 === 3.Object.prototype.toString.call 4 ...
- JS基础之undefined与null的区别
在JavaScript开发中,被人问到:null与undefined到底有啥区别? 一时间不好回答,特别是undefined,因为这涉及到undefined的实现原理.于是,细想之后,写下本文,请各位 ...
- undefined 和null的区别?
null是一个表示"无"的对象,转为数值时为0:undefined是一个表示"无"的原始值,转为数值时为NaN. undefined: (1)变量被声明了,但没 ...
- JS中undefined和null的区别,以及出现原因
区别:null是一个表示无的对象,转换为数值为0: undefined表示一个无的原始值,转化为数值为NAN(与任何数字相加也为NAN) undefined出现原因:(口诀:一变量二函数一对象) 1. ...
- 你知道undefined与null的区别吗?
转载于:https://www.cnblogs.com/shiweihappy/p/4246448.html
- java Null==undefined_javascript中的undefined和null有什么区别
原标题:javascript中的undefined和null有什么区别 java中的undefined和null的区别有:类型不同前者返回的是未定义值后者是对象:转换原始类型方式不同前者是不支持转换后 ...
- 在JS中如何判断undefined和null
不当用法 有时为了判断某个值有效,JS新手会写这种臃肿代码: if (data != null && typeof(data) != undefined && data ...
- [JS] undefined、null、ReferenceError的区别、变量作用域问题
undefined.null.ReferenceError的区别 null表示"没有对象",即该处不应该有值. 典型用法是: (1) 作为函数的参数,表示该函数的参数不是对象. ( ...
- javascript中not defined、undefined、null以及NaN的区别
[ 前言 ] 从踏入IT行业开始,我就发现技术人员写博客很有必要.如果不写博客,时间久了就像好比天天在外面建房子的人,没有一个自己的房子一样.不管学习紧不紧,工作忙不忙,多动手进行梳理总结,一方面是为 ...
- 前端小知识点(1):undefined和null区别
目录 一.奇怪点 二.历史原因 三.具体区别 四.代码演示 五.运行结果 一.奇怪点 有点奇怪的是,JavaScript语言居然有两个表示"无"的值:undefined和null. ...
最新文章
- 图灵机与控制论之分歧,一切为了人类心智的荣耀!
- python自学平台-怎么自学python,大概要多久?
- 阿里笔试题—战报交流
- 应用jBPM4解决中国特色的流程需求 (看过之后,强烈推荐)
- 喜报!中华万年历签约神策数据
- php中数组下标,PHP数组介绍_php
- testmeshpro合批_TextMesh Pro Emoji Align With Text(表情和文字对齐)
- WinAPI: 钩子回调函数之 CallWndProcRetProc
- ZooKeeper官方文档学习笔记01-zookeeper概述
- Windows核心编程_PE文件格式详细介绍
- 27. PHP 文件创建/写入
- easyswoole验证码的使用
- 中国智慧停车行业未来前景展望及项目运营规模咨询报告2021-2027年
- php微信公众号登录
- Kubernetes 管理员认证(CKA)考试笔记(二)
- peer channel create解析
- 利用ip138取得公网IP,公网ip改变后报警通知我们进行更改
- Android Studio升级到3.5之后xml格式化问题
- 邮件营销 – 电子邮件营销的20个技巧
- JS实现答题上一题下一题