在开始学习和使用js的时候,对
null
和undefined
的理解上可能存在一定的混淆,总结一下自己的它们的理解.
undefined
undefined
用来表示一个变量尚未定义或者变量定义了但是现在并没有初始化数据
var a;
console.log(a);//返回值是"undefined"
这个也容易了解,大家也知道,Javascript是一种弱类型的语言,设想现在你定义了变量,变量里面并没有給任何值,请问你能告诉我这个变量用来保存什么类型的值吗?我想你的回答肯定是:“不知道,因为没有足够的信息去判断”,
同样,Javascript引擎现在也获取不到足够的信息来判断当前的变量是什么类型的,所有它只能告诉你的是:undefined
(“俺也不知道”).
null
null
其实是一种赋值,用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象, 它如果赋值给某个变量,用来表示当前变量属于一种没有值的状态,从一定角度上可以理解为占位.例如:
alert(null == document.getElementById('notExistElement'));
当页面上不存在id为”notExistElement”的DOM节点时,这段代码显示为”true”,因为我们尝试获取一个不存在的对象。
再看下面一段代码:
typeof undefined;//结果是:undefined
typeof null; //结果是: object
从上面的例子中我们可以得知,null
和undefined
其实是两种不同类型的值,undefined
的类型是它本身,而null
的类型是Object.,为什么null的类型是Object了呢?其实这是JavaScript最初实现的一个错误,后来被ECMAScript沿用下来。
下面这几个判断,经常遇到:
null === undefined // false
null == undefined // true
null === null // true
null = 'value' // ReferenceError
undefined = 'value' // 'value'
如何区分呢?
其实两者从效果上基本上都是一样,区别主要在于强调的点不同,undefined
强调的是变量并没有初始化,而null
强调是将当前的变量设置为没有值的状态.
JavaScript的最初版本是这样区分的:null是一个表示”无”的对象,转为数值时为0;undefined是一个表示”无”的原始值,转为数值时为NaN。
+ null ;//结果会是:0
+ undefined;//结果会是: NaN
参考:
1. 阮一峰: undefined与null的区别
2. Stackoverflow: What is the difference between null and undefined in JavaScript?
3. JS中Null与Undefined的区别