前面的话
javascript的设计者Brendan Eich,设计了两种数据类型都表示“无”的意思,虽然两者含义相同,但两者还是有细微差别。
null是一个表示“无”的对象,转为数值时为0,undefined是一个表示“无”的原始值,转为数值时是NaN。
Undefined类型
Undefined类型只有一个值,即Undefined。
什么情况是undefined?
在使用var声明变量时,但未对其加以初始化时,这个变量值为undefined。
例如:
var message ;
console.log(message == undefined)// true;
不过,包含undefined值的变量与尚未定义的变量还是不一样的。
var msg ;
console.log(msg);// undefined
console.log(a);// 产生错误
对于尚未声明的变量,只能执行一项操作,即使用typeof操作符检测其数据类型(并且严格模式下还会报错)
// test 未声明
console.log(typeof test);// undefined
[出现场景]
- 已声明未赋值的变量
- 获取对象不存在的属性
- 空函数体的函数执行结果
- 函数的参数没有传入
- void(表达式)
var a ;
console.log(a);// undefined
var object = {};
console.log(object.a) // undefined
function fn() {};
console.log(fn()); // undefined
function fn(x) {return x};
console.log(fn()); // undefined
console.log(void(1+4));// undefined
[类型转换]
console.log( Boolean(undefined));// false
console.log( Number(undefined)); // NaN
console.log( String(undefined));// "undefined"
[类型鉴别]
鉴别undefined的类型,使用typeof操作符即可
console.log(typeof undefined)// 'undefined'
Null类型
Null 类型的数据类型也只有一个值,这个特殊值为null。
从逻辑角度来看,null值表示一个空对象指针。
console.log(document.getElementById('test'));// null
[注意]: null是空对象指针,[]是空数组,{}是空对象,三者不同
console.log(typeof null)// 'object'
为什么null的类型是object?
因为在 JS 的最初版本中,使用的是 32 位系统,为了性能考虑使用低位存储了变量的类型信息,000 开头代表是对象,然而 null 表示为全零,所以将它错误的判断为 object 。虽然现在的内部类型判断代码已经改变了,但是对于这个 Bug 却是一直流传下来。
尽管null的undefined是不同的,但是它们都表示"值的空缺",null表示“空值”,undefined表示“未初始化”。两者可以互换。运算符“==”认为两者相等
console.log(null == undefined);// true
[类型转换]
console.log(Boolean(null));// false
console.log(Number(null))// 0
console.log(String(null))// 'null'
[类型鉴别]
鉴别null类型,使用typeof操作符不可行,因为该操作符会返回“object”,null被认为是空对象。
判断一个值是否为null类型的最佳方法是直接和null进行恒等比较
console.log(typeof null)// 'object'
console.log(null === null);// true
console.log(undefined === null) // false
console.log('null' === null)// false
总结
- 无论在什么情况下,都没有必要把一个变量的值显示的设置为undefined,对null不适用。
- 如果定义的变量准备将来用来存放保存对象,那么最好将该变量初始化为null,而不是其他值。这样体现了null作为空对象指针的惯例。
参考:
- 《JavaScript高级程序设计》
- 阮一峰Javascript标准参考教程——语法概述 http://javascript.ruanyifeng.com/grammar/basic.html#toc21
- 个人比较喜欢的博主:
https://www.cnblogs.com/xiaohuochai/p/5665637.html