null == undefined?
console.log(null==undefined)//true console.log(null===undefined)//false
通过上述可得,null与undefined两者结果是相等的,但全等又不等
1.undefined
undefined字面意思为未定义的值,语义是一个变量最原始的状态,并非认为操作的结果
场景:
1.声明了一个变量,但没有赋值
var foo; console.log(foo); //undefined
此变量声明后并未使用也未被定义
2.访问对象上不存在的属性
console.log(Object.foo); // undefined
访问object对象上的foo属性,但object上并没有这个属性
3.函数定义了形参,但未传递实参
//函数定义了形参 a
function fn(a) {
console.log(a); //undefined
}
fn(); //未传递实参
函数fn定义了形参a,但fn被调用时未传递参数
4.使用void对表达式求值
void 0 ; // undefined
void false; //undefined
void []; //undefined
void null; //undefined
void function fn(){} ; //undefined
2.null
null字面意思为空值,表示一个对象被人为的重置为空对象
typeof null == 'object'
由此可知,null在有自己类型null的情况下,使用typeof判断却为object类型,
这是因为JavaScript 数据类型在底层都是以二进制的形式表示的,二进制的前
三位为 0 会被 typeof 判断为对象类型,而 null 的二进制位恰好都是 0 ,
因此,null 被误判断为 Object 类型。
如何判断null和undefined的真实类型
Object.prototype.toString.call(null) ; // [object Null]
Object.prototype.toString.call(undefined) ; // [object Undefined]
null和undefined的历史
1995年JavaScript诞生时,最初像Java一样,只设置了null作为表示"无"的值。
根据C语言的传统,null被设计成可以自动转为0。
Number(null)
// 0
5 + null
// 5
但是,JavaScript的设计者Brendan Eich,觉得这样做还不够,有两个原因。
首先,null像在Java里一样,被当成一个对象。但是,JavaScript的数据类型分成原始类型(primitive)和合成类型(complex)两大类,Brendan Eich觉得表示"无"的值最好不是对象。
其次,JavaScript的最初版本没有包括错误处理机制,发生数据类型不匹配时,往往是自动转换类型或者默默地失败。Brendan Eich觉得,如果null自动转为0,很不容易发现错误。
因此,Brendan Eich又设计了一个undefined。