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 圆角div的实现代码
Oct 15 Javascript
js取整数、取余数的方法
May 11 Javascript
JavaScript中的函数模式详解
Feb 11 Javascript
js+HTML5实现视频截图的方法
Jun 16 Javascript
分享我对JS插件开发的一些感想和心得
Feb 04 Javascript
详解打造 Vue.js 可复用组件
Mar 24 Javascript
JS实现点击链接切换显示隐藏内容的方法
Oct 19 Javascript
jquery+ajaxform+springboot控件实现数据更新功能
Jan 22 jQuery
React Native 图片查看组件的方法
Mar 01 Javascript
nuxt中使用路由守卫的方法步骤
Jan 27 Javascript
JS匿名函数内部this指向问题详析
May 10 Javascript
一篇文章了解正则表达式的替换技巧
Feb 24 Javascript
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
对Session和Cookie的区分与解释
2007/03/16 PHP
php图片的裁剪与缩放生成符合需求的缩略图
2013/01/11 PHP
改写ThinkPHP的U方法使其路由下分页正常
2014/07/02 PHP
Yii2增删改查之查询 where参数详细介绍
2016/08/08 PHP
基于php中echo用逗号和用点号的区别详解
2018/01/23 PHP
javascript中创建对象的几种方法总结
2013/11/01 Javascript
iframe子页面与父页面在同域或不同域下的js通信
2014/05/07 Javascript
js获取select默认选中的Option并不是当前选中值
2014/05/07 Javascript
javascript实现根据iphone屏幕方向调用不同样式表的方法
2015/07/13 Javascript
jquery滚动条插件(可以自定义)
2016/12/11 Javascript
实例解析angularjs的filter过滤器
2016/12/14 Javascript
基于bootstrop常用类总结(推荐)
2017/09/11 Javascript
利用nvm管理多个版本的node.js与npm详解
2017/11/02 Javascript
vue实现仿淘宝结账页面实例代码
2017/11/08 Javascript
js实现上下左右键盘控制div移动
2020/01/16 Javascript
vue实现购物车加减
2020/05/30 Javascript
[56:35]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第二局
2016/02/27 DOTA
python字符类型的一些方法小结
2016/05/16 Python
Python爬虫实现网页信息抓取功能示例【URL与正则模块】
2017/05/18 Python
Python hmac模块使用实例解析
2019/12/24 Python
Python 面向对象静态方法、类方法、属性方法知识点小结
2020/03/09 Python
Python 实现键盘鼠标按键模拟
2020/11/18 Python
python中pow函数用法及功能说明
2020/12/04 Python
房产销售经理职责
2013/12/20 职场文书
给分销商的致歉信
2014/01/14 职场文书
指导教师评语
2014/04/26 职场文书
我们的节日清明节活动总结
2014/04/30 职场文书
大学学风建设方案
2014/05/04 职场文书
高中综合实践活动总结
2014/07/07 职场文书
机械设计专业大学生职业生涯规划书范文
2014/09/13 职场文书
2015小学师德工作总结
2015/07/21 职场文书
大学体育课感想
2015/08/10 职场文书
2016暑期政治学习心得体会
2016/01/23 职场文书
《有余数的除法》教学反思
2016/02/22 职场文书
导游词之无锡梅园
2019/11/28 职场文书
Redis实现短信验证码登录的示例代码
2022/06/14 Redis