Javascript类型系统之undefined和null浅析


Posted in Javascript onJuly 13, 2016

前面的话

一般的程序语言,表示空的只有null,但javascript的设计者Brendan Eich却设计了一个undefined,这无疑增加了程序复杂度,但这样做也是有一定原因的。本文将详细介绍javascript中的undefined和null

历史原因

1995年JavaScript诞生时,最初像Java一样,只设置了null作为表示”无”的值。根据C语言的传统,null被设计成可以自动转为0

但是,JavaScript的设计者Brendan Eich,觉得这样做还不够,有两个原因。首先,null像在Java里一样,被当成一个对象。但是,JavaScript的值分成原始类型和对象类型两大类,Brendan Eich觉得表示”无”的值最好不是对象。其次,JavaScript的最初版本没有包括错误处理机制,发生数据类型不匹配时,往往是自动转换类型或者默默地失败。Brendan Eich觉得,如果null自动转为0,很不容易发现错误

因此,Brendan Eich又设计了一个undefined。他是这样区分的:null是一个表示”无”的对象,转为数值时为0;undefined是一个表示”无”的原始值,转为数值时为NaN

但是,目前null和undefined基本是同义的,都是原始类型,且只有一些细微的差别

undefined

Undefined类型只有一个值,就是undefined。当声明的变量未初始化时,该变量的默认值是undefined。所以一般地,undefined表示变量没有初始化

var test;//undefined
console.log(test == undefined);//true
var test = undefined;//undefined

对于尚未声明过的变量只能执行一项操作,使用typeof操作符检测其数据类型,但严格模式下会导致错误

typeof(test);//undefined

【出现场景】

【1】已声明未赋值的变量

【2】获取对象不存在的属性

【3】无返回值的函数的执行结果

【4】函数的参数没有传入

【5】void(expression)

var i;
console.log(i);//undefined
var o = {};
console.log(o.p);//undefined
function f(){};
console.log(f());//undefined
function f(x){return x;}
console.log(f());//undefined
console.log(void(0));//undefined

【类型转换】

Boolean(undefined):  false
Number(undefined):  NaN
String(undefined):'undefined'

null

Null类型只有一个值,就是null。null是javascript语言的关键字,它表示一个特殊值,常用来描述"空值"

逻辑角度看,null值表示一个空对象指针

[注意]null是空对象指针,而[]是空数组,{}是空对象,三者不相同

console.log(typeof null);//'object'

尽管null和undefined是不同的,但它们都表示"值的空缺",null表示"空值",undefined表示"未定义"。两者往往可以互换。判断相等运算符==认为两者是相等的

console.log(null == undefined);//true

实际上,因为undefined和null不是构造器类型,所以它们没有任何的属性和方法,使用.和[]来存取这两个值的成员或方法都会产生一个类型错误

【类型转换】

Boolean(null): false
Number(null):
 0
String(null): 
 'null'

下面给大家介绍javascript中null和undefined的区别

undefined表示变量声明但未初始化时的值,null表示准备用来保存对象,还没有真正保存对象的值。从逻辑角度看,null值表示一个空对象指针。

JavaScript(ECMAScript标准)里共有5种基本类型:Undefined, Null, Boolean, Number, String,和一种复杂类型Object。可以看到null和undefined分属不同的类型,未初始化定义的值用typeof检测出来是"undefined"(字符串),而null值用typeof检测出来是"object"(字符串)。

任何时候都不建议显式的设置一个变量为undefined,但是如果保存对象的变量还没有真正保存对象,应该设置成null。
实际上,undefined值是派生自null值的,ECMAScript标准规定对二者进行相等性测试要返回true,即

alert(null==undefined); // true
Javascript 相关文章推荐
Javascript 函数中的参数使用分析
Mar 27 Javascript
jQuery的实现原理的模拟代码 -2 数据部分
Aug 01 Javascript
一个JavaScript递归实现反转数组字符串的实例
Oct 14 Javascript
浅析jQuery移动开发中内联按钮和分组按钮的编写
Dec 04 Javascript
Vue监听数据对象变化源码
Mar 09 Javascript
EasyUI框架 使用Ajax提交注册信息的实现代码
Sep 27 Javascript
利用VS Code开发你的第一个AngularJS 2应用程序
Dec 15 Javascript
使用Angular CLI生成路由的方法
Mar 24 Javascript
vue实现导航标题栏随页面滚动渐隐渐显效果
Mar 12 Javascript
Vant 在vue-cli 4.x中按需加载操作
Nov 05 Javascript
JS Canvas接口和动画效果大全
Apr 29 Javascript
vue3引入highlight.js进行代码高亮的方法实例
Apr 08 Vue.js
JS基础随笔(菜鸟必看篇)
Jul 13 #Javascript
Bootstrap的Refresh Icon也spin起来
Jul 13 #Javascript
jQuery实现div横向拖拽排序的简单实例
Jul 13 #Javascript
用jQuery向div中添加Html文本内容的简单实现
Jul 13 #Javascript
使用jQuery加载html页面到指定的div实现方法
Jul 13 #Javascript
用原生JS对AJAX做简单封装的实例代码
Jul 13 #Javascript
javascript类型系统——undefined和null全面了解
Jul 13 #Javascript
You might like
php后台程序与Javascript的两种交互方式
2009/10/25 PHP
php中的ini配置原理详解
2014/10/14 PHP
jquery 多行滚动代码(附详细解释)
2010/06/17 Javascript
js函数的引用, 关于内存的开销
2012/09/17 Javascript
JQuery实现图片轮播效果
2015/09/15 Javascript
BooStrap对导航条的改造实践小结
2016/09/21 Javascript
JavaScript 身份证号有效验证详解及实例代码
2016/10/20 Javascript
easyui form validate总是返回false的原因及解决方法
2016/11/07 Javascript
防止重复发送 Ajax 请求
2017/02/15 Javascript
浅谈react前后端同构渲染
2017/09/20 Javascript
vue使用xe-utils函数库的具体方法
2018/03/06 Javascript
Vue 自定义动态组件实例详解
2018/03/28 Javascript
微信{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"}
2018/10/12 Javascript
JS开发自己的类库实例分析
2019/08/28 Javascript
Vue插件之滑动验证码用法详解
2020/04/05 Javascript
[02:49]2014DOTA2电竞也是体育项目! 势要把荣誉带回中国!
2014/07/20 DOTA
python3编码问题汇总
2016/09/06 Python
django使用图片延时加载引起后台404错误
2017/04/18 Python
Django中的Signal代码详解
2018/02/05 Python
用TensorFlow实现lasso回归和岭回归算法的示例
2018/05/02 Python
Python模拟登录的多种方法(四种)
2018/06/01 Python
使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解
2020/01/25 Python
python单例模式的应用场景实例讲解
2021/02/24 Python
对pytorch中x = x.view(x.size(0), -1) 的理解说明
2021/03/03 Python
南威尔士家居商店:Leekes
2016/10/25 全球购物
C面试题
2015/10/08 面试题
工商管理本科毕业生求职信范文
2013/10/05 职场文书
怎么写好自荐书
2014/03/02 职场文书
物业管理专业求职信
2014/06/11 职场文书
运动会广播稿100字
2014/09/14 职场文书
毕业生实习证明
2014/09/19 职场文书
2015年乡镇平安建设工作总结
2015/05/13 职场文书
单位工作证明范本
2015/06/15 职场文书
单位车辆管理制度
2015/08/05 职场文书
Python函数对象与闭包函数
2022/04/13 Python
Python tensorflow卷积神经Inception V3网络结构
2022/05/06 Python