目录:

  • 基本数据类型
  • underfined
    • 声明一个变量,但是没有赋值
    • 访问对象上不存在的属性或者未定义的变量
    • 函数定义了形参,但没有传递实参
    • 使用void对表达式求值
  • null
    • 两种情况下我们会将变量赋值为null
    • 特殊的typeof null
  • 总结

一、基本数据类型

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

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

二、underfined

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 即可。

JS 应用篇(一):Underfined与Null的区别相关推荐

  1. ie9无法获取未定义或 null 引用的属性“indexof”_前端JS基础篇(二)JS基本数据类型和引用数据类型及检测数据类型方法...

    JS中的数据类型 (一).基本数据类型(值类型) 1.number:数字 -12.12.5.-12.5 0这些数字都是number: js中增加了一个number类型的数据:'NaN' typeof ...

  2. JS基础篇--HTML DOM classList 属性

    页面DOM里的每个节点上都有一个classList对象,程序员可以使用里面的方法新增.删除.修改节点上的CSS类.使用classList,程序员还可以用它来判断某个节点是否被赋予了某个CSS类. 添加 ...

  3. 前端面试题汇总(JS 基础篇)

    前端面试题汇总(JS 基础篇)** 1.javascript 的 typeof 返回哪些数据类型** object number function boolean underfind stringty ...

  4. cytoscape.js初级篇

    cytoscape.js初级篇 系列文章 前言 cytoscape依赖引用 cytoscape扩展依赖引用 创建Cytoscape组件 创建Cytoscape模板容器 创建Cytoscape实例对象 ...

  5. cytoscape.js进阶篇

    cytoscape.js进阶篇 系列文章 前言 cytoscape依赖引用 cytoscape扩展依赖引用 升级Cytoscape组件 扩展Cytoscape组件模板容器 扩展Cytoscape组件方 ...

  6. three.js 项目篇 之 汽车展示与控制车身颜色与贴膜材质

    目录 three.js 项目篇 之 汽车展示与操作 创建项目 App.vue 代码 效果 three.js 项目篇 之 汽车展示与操作 创建项目 yarn add three gsap App.vue ...

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

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

  8. Node.js学习准备篇

    这里写个Node.js 准备篇包含内容有node.js 的安装,命令行运行node.js 文件,使用webStrom 编写 node.js 时有提示功能,并用webStrom 运行 Node.js 其 ...

  9. js入门篇--制作简单闪烁图片

    js入门篇–制作闪烁图片 刚刚学习,大神勿喷,还请多多指点... <body "soccerOnload()" topmargin="0"> //o ...

  10. web前端开发分享js进阶篇

    js进阶篇: js进阶,等妙味看的差不多,心里难免痒痒,看老师用尽可能少的代码来实现了众多以前没法实现的动态效果.然后自己想写,但不知道写啥东西,下面就这个问题做以建议,写这些东西的目的有这么几个,一 ...

最新文章

  1. [转载]oracle索引的简单总结
  2. 公益合种油松专车3天领证
  3. Spring MVC学习笔记——POJO和DispatcherServlet
  4. python代码大全表解释-.python3基础之“术语表(1)”
  5. sqlserver 的一些好用的插件
  6. c++调用cplex求解例子_Java调用cplex求解运输问题
  7. shell脚本实现自动化备份
  8. Java中需要全部小写的是,java – 如何处理JSR 310中的大写或小写?
  9. 从Jetty、Tomcat和Mina中提炼NIO构架网络服务器的经典模式(二)
  10. buffer正确的拼接方式
  11. 计算机网络教学仿真平台,网络三维虚拟校园仿真平台构建
  12. twaver API笔记
  13. 三种Web服务交互方案
  14. eth0 eth0:1 eth0.1 的区别
  15. Linux挂载Windows共享文件夹
  16. 什么是编译程序(含翻译程序、解释程序和中间代码的定义介绍)
  17. echarts中每个数据项特定的tooltip设定
  18. Ipad越狱注意事项
  19. 网 络 世 界 的 黑 暗 面
  20. Latex之安装GBK字体

热门文章

  1. 我原来的chinaunix博客地址
  2. html是什么意思 它是一种什么样的语言,HTML 是什么?
  3. java基础【十二】外存、内存、CPU、缓存
  4. java使用nmap工具进行端口扫描,简单学习
  5. 围观神仙打架,反革命工程师《iOS应用架构谈 组件化方案》和蘑菇街Limboy的《蘑菇街 App 的组件化之路》的阅读指导
  6. HTML5期末大作业:基于HTML+CSS+JavaScript仿蘑菇街购物商城设计毕业论文源码
  7. cygwin下使用apt-cyg安装新软件
  8. java 修改图片后缀名,不改变图片前缀名
  9. windowns 程序图标变白色
  10. Launcher3 翻页动画详解与修改