日期:2014-05-16 浏览次数:20470 次
以下纯属个人见解,若有更好的意见,请写下来,共同进步
?
发现ECMAScript中的undefined类型和null类型很有意思。。。。。他们是ECMAScript中唯一只有一个值的类型,而且一般情况下,在代码调试中,一旦提示该类型,都很让人纠结和蛋疼,所以这里就爆一下他们的内幕。。。
?
首先,Undefined类型和null类型都是原始类型,也就是说,声明为该类型的值为直接存放在栈中。
?
undefined类型的值是"undefined",为什么我没有用也是呢,因为前面表示的是类型,后面表示的是它的字面值。
null类型的值是"null",为什么我也没有用也是呢,因为前面表示的也是类型,后面表示的也是它的字面值。
?
下面说下变量声明:
undefined:
声明后未初始化的变量,和声明为undefined类型的变量当进行==判断的时候是相等的,进行typeof运算后,他们的类型也都是undefined,值也相同。例如:
?
var u1;
alert(u1==undefined)
结果:true
?
但是,未声明的变量和undefined类型不太一样,虽然用typeof运算出来他们都是undefined类型,例如:
alert(u2==undefined)
结果:报错,并提示u2未定义
?
而用alert(typeof(u2))
结果:undefined
?
说明:未声明的变量类型为undefined,但值并不是undefined。typeof运算只运算类型。而==运算区分类型和值,W3C说的是除了typeof运算符,其他运算符只能用于声明、定义过的变量。
?
?
W3C说undefined 实际上是从值 null 派生来的,因此 ECMAScript 把它们定义为相等的。
注意:我这里使用的undefined和null都是小写,因为在javascript中,是区分大小写的,例如:
?
if(NULL == undefined){
alert("相等")
}
结果:提示NULL未定义,这里把NULL当成了一个变量,而undefined是一个原始类型值,就好像number。
?
if(NULL == undefined){
alert("相等")
}
结果:相等。
?
?
null:
使用typeof运算null会发现结果是object,这个结果让人很不满意,如果按照正常的逻辑思维,undefined类型用typeof运算的时候就也应该是object。这里W3C说 这是JavaScript 最初实现中的一个错误,然后被 ECMAScript 沿用了。现在,null 被认为是对象的占位符。
?
上面说过,undefined实际上时null派生来的,这里我也有几个疑问:
1.如果这样的话,undefined类型的底层实现是不是也是object?使用==运算符运算undefined和null,结果他们是相等的,这说明他们的值和类型都是相同的。那是不是就可以直接推出undefined类型底层实现的时候,类型就是object并且值就是null?