JS 应用篇(一):Underfined与Null的区别
目录:
- 基本数据类型
- 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的区别相关推荐
- ie9无法获取未定义或 null 引用的属性“indexof”_前端JS基础篇(二)JS基本数据类型和引用数据类型及检测数据类型方法...
JS中的数据类型 (一).基本数据类型(值类型) 1.number:数字 -12.12.5.-12.5 0这些数字都是number: js中增加了一个number类型的数据:'NaN' typeof ...
- JS基础篇--HTML DOM classList 属性
页面DOM里的每个节点上都有一个classList对象,程序员可以使用里面的方法新增.删除.修改节点上的CSS类.使用classList,程序员还可以用它来判断某个节点是否被赋予了某个CSS类. 添加 ...
- 前端面试题汇总(JS 基础篇)
前端面试题汇总(JS 基础篇)** 1.javascript 的 typeof 返回哪些数据类型** object number function boolean underfind stringty ...
- cytoscape.js初级篇
cytoscape.js初级篇 系列文章 前言 cytoscape依赖引用 cytoscape扩展依赖引用 创建Cytoscape组件 创建Cytoscape模板容器 创建Cytoscape实例对象 ...
- cytoscape.js进阶篇
cytoscape.js进阶篇 系列文章 前言 cytoscape依赖引用 cytoscape扩展依赖引用 升级Cytoscape组件 扩展Cytoscape组件模板容器 扩展Cytoscape组件方 ...
- three.js 项目篇 之 汽车展示与控制车身颜色与贴膜材质
目录 three.js 项目篇 之 汽车展示与操作 创建项目 App.vue 代码 效果 three.js 项目篇 之 汽车展示与操作 创建项目 yarn add three gsap App.vue ...
- 在JS中如何判断undefined和null
不当用法 有时为了判断某个值有效,JS新手会写这种臃肿代码: if (data != null && typeof(data) != undefined && data ...
- Node.js学习准备篇
这里写个Node.js 准备篇包含内容有node.js 的安装,命令行运行node.js 文件,使用webStrom 编写 node.js 时有提示功能,并用webStrom 运行 Node.js 其 ...
- js入门篇--制作简单闪烁图片
js入门篇–制作闪烁图片 刚刚学习,大神勿喷,还请多多指点... <body "soccerOnload()" topmargin="0"> //o ...
- web前端开发分享js进阶篇
js进阶篇: js进阶,等妙味看的差不多,心里难免痒痒,看老师用尽可能少的代码来实现了众多以前没法实现的动态效果.然后自己想写,但不知道写啥东西,下面就这个问题做以建议,写这些东西的目的有这么几个,一 ...
最新文章
- [转载]oracle索引的简单总结
- 公益合种油松专车3天领证
- Spring MVC学习笔记——POJO和DispatcherServlet
- python代码大全表解释-.python3基础之“术语表(1)”
- sqlserver 的一些好用的插件
- c++调用cplex求解例子_Java调用cplex求解运输问题
- shell脚本实现自动化备份
- Java中需要全部小写的是,java – 如何处理JSR 310中的大写或小写?
- 从Jetty、Tomcat和Mina中提炼NIO构架网络服务器的经典模式(二)
- buffer正确的拼接方式
- 计算机网络教学仿真平台,网络三维虚拟校园仿真平台构建
- twaver API笔记
- 三种Web服务交互方案
- eth0 eth0:1 eth0.1 的区别
- Linux挂载Windows共享文件夹
- 什么是编译程序(含翻译程序、解释程序和中间代码的定义介绍)
- echarts中每个数据项特定的tooltip设定
- Ipad越狱注意事项
- 网 络 世 界 的 黑 暗 面
- Latex之安装GBK字体
热门文章
- 我原来的chinaunix博客地址
- html是什么意思 它是一种什么样的语言,HTML 是什么?
- java基础【十二】外存、内存、CPU、缓存
- java使用nmap工具进行端口扫描,简单学习
- 围观神仙打架,反革命工程师《iOS应用架构谈 组件化方案》和蘑菇街Limboy的《蘑菇街 App 的组件化之路》的阅读指导
- HTML5期末大作业:基于HTML+CSS+JavaScript仿蘑菇街购物商城设计毕业论文源码
- cygwin下使用apt-cyg安装新软件
- java 修改图片后缀名,不改变图片前缀名
- windowns 程序图标变白色
- Launcher3 翻页动画详解与修改