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 相关文章推荐
js返回上一页并刷新代码整理
Dec 21 Javascript
setTimeout自动触发一个js的方法
Jan 15 Javascript
javascript如何判断输入的url是否正确
Apr 11 Javascript
jQuery模拟点击A标记示例参考
Apr 17 Javascript
node.js中的fs.fchmod方法使用说明
Dec 16 Javascript
JS组件Bootstrap实现弹出框和提示框效果代码
Dec 08 Javascript
Bootstrap模态框案例解析
Mar 05 Javascript
Node.js中的http请求客户端示例(request client)
May 04 Javascript
angular使用post、get向后台传参的问题实例
May 27 Javascript
Vue.js 2.5新特性介绍(推荐)
Oct 24 Javascript
vue仿ios列表左划删除
Sep 26 Javascript
vue.js中ref及$refs的使用方法解析
Oct 08 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
PHP学习笔记 IIS7下安装配置php环境
2012/10/29 PHP
php实现将任意进制数转换成10进制的方法
2015/04/17 PHP
PHP附件下载中文名称乱码的解决方法
2015/12/17 PHP
PHP不使用内置函数实现字符串转整型的方法示例
2017/07/03 PHP
thinkPHP5项目中实现QQ第三方登录功能
2017/10/20 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
2017/11/17 PHP
PHP array_shift()用法实例分析
2019/01/07 PHP
php+ajax实现文件切割上传功能示例
2020/03/03 PHP
飞鱼(shqlsl) javascript作品集
2006/12/16 Javascript
javascript学习笔记(十四) window对象使用介绍
2012/06/20 Javascript
Three.js源码阅读笔记(基础的核心Core对象)
2012/12/27 Javascript
jquery fancybox ie6不显示关闭按钮的解决办法
2013/12/25 Javascript
js函数内变量的作用域分析
2015/01/12 Javascript
jQuery中cookie插件用法实例分析
2015/12/04 Javascript
jQuery on()方法绑定动态元素的点击事件无响应的解决办法
2016/07/07 Javascript
jQuery实现的导航下拉菜单效果示例
2016/09/05 Javascript
Javascript 严格模式use strict详解
2017/09/16 Javascript
React Router v4 入坑指南(小结)
2018/04/08 Javascript
vue.js中导出Excel表格的案例分析
2019/06/11 Javascript
微信小程序在线客服自动回复功能(基于node)
2019/07/03 Javascript
Vue 子组件与数据传递问题及注意事项
2019/07/11 Javascript
跟老齐学Python之用while来循环
2014/10/02 Python
Python爬虫抓取手机APP的传输数据
2016/01/22 Python
Python函数的参数常见分类与用法实例详解
2019/03/30 Python
python算法与数据结构之单链表的实现代码
2019/06/27 Python
python使用tomorrow实现多线程的例子
2019/07/20 Python
Python3 中作为一等对象的函数解析
2019/12/11 Python
Python开发企业微信机器人每天定时发消息实例
2020/03/17 Python
Python预测2020高考分数和录取情况
2020/07/08 Python
小学教师自我鉴定
2013/11/07 职场文书
广播体操比赛口号
2014/06/10 职场文书
2014年入党积极分子学习三中全会思想汇报
2014/09/13 职场文书
村主任群众路线个人对照检查材料
2014/09/26 职场文书
巾帼标兵事迹材料
2014/12/26 职场文书
2015年财政局工作总结
2015/05/21 职场文书
优质护理服务心得体会
2016/01/22 职场文书