日期:2014-05-16  浏览次数:20467 次

说说 javascript undefined类型

以下纯属个人见解,若有更好的意见,请写下来,共同进步

?

发现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?