undefined 和 null

一. undefined在变量声明中的体现:

1)声明了、但是没有初始化的变量:

var aa;
alert(aa);

浏览器会弹出窗口显示 undefined。因为对于使用了 var 声明但没有进行初始化定义的变量, 其值默认为 undefined.
2) 未声明的变量(1):

alert(aa);

浏览器不会弹出任何东西. 因为 aa 是没有声明的变量。打开 chrome 浏览器的控制台会看到报错如下:
undefined 和 null_第1张图片

3)未声明的变量(2):

alert(typeof aa);

浏览器会弹出窗口显示 undefined。对于没有声明的变量, 只能执行一种操作,即使用 typeof 操作符检验它的类型.。它的类型和声明了但没有进行初始化的变量的类型一样, 都是 undefined.

二. null和undefined:

alert(undefined == null); // 返回 true

对于undefined 和null 的相等性测试,返回 true,如上图。这是因为,undefined是由null派生而来的。但是,这两者差别很大,之所以要设置两个值,让我们从历史原因说起吧
1)历史原因:
1995年js诞生时,最初像Java一样,只设置了null作为表示"无"的值。根据C语言的传统,null被设计成可以自动转为0。但是,JavaScript的设计者Brendan Eich,觉得这样做还不够,有两个原因。首先,null像在Java里一样,被当成一个对象。但是,JavaScript的数据类型分成原始类型(primitive)和合成类型(complex)两大类,Brendan Eich觉得表示"无"的值最好不是对象;其次,JavaScript的最初版本没有包括错误处理机制,发生数据类型不匹配时,往往是自动转换类型或者默默地失败。Brendan Eich觉得,如果null自动转为0,很不容易发现错误。
因此,Brendan Eich又额外设计了一个undefined。

2)最初设计:
JavaScript的最初版本是这样区分的:null是一个表示"无"的对象,转为数值时为0;undefined是一个表示"无"的原始值,转为数值时为NaN。

Number(undefined)
// NaN
5 + undefined
// NaN

3)目前的用法:
但是,上面这样的区分,在实践中很快就被证明不可行。实践中有很多需要注意的地方。

①null

null是基本数据类型之一,值仅有一个,即为null。表示"空对象"(因此类型检测返回对象),即如果有对象,就会是一个具体的对象,如果没对象,就是null。典型用法是:
(1) 作为函数的参数,表示该函数的参数不是对象。
(2) 作为对象原型链的终点。

Object.getPrototypeOf(Object.prototype) // null

typeof null     // object

如果定义的变量准备在将来用来保存对象,那么最好将该变量初始化为null而不是其他值。这样做不仅可以体现null作为空对象指针的惯例,而且也有助于进一步区分null和undefined。
只要直接检查null值就可以知道相应的变量是否已经保存了一个对象的引用,如下面的例子:

if(abc != null){
//对abc执行某些操作
}

②undefined

undefined是基本数据类型之一,值仅有一个,即为undefined。表示"缺少值"(因此类型检测返回undefined),即此处应该有一个值,但是还没有定义。典型用法是:
(1)变量被声明了,但没有赋值时,就等于undefined。
(2) 调用函数时,应该提供的参数没有提供,该参数等于undefined。
(3)对象没有赋值的属性,该属性的值为undefined。
(4)函数没有返回值时,默认返回undefined。

var i;
i // undefined
function f(x){console.log(x)}f() // undefined
var o = new Object();
o.p // undefined
var x = f();
var exp = undefined;
8x // undefined

③如何检测某个变量是undefined:

错误的用法:
if(abc==undefined) // 正如上面所说,js规定用== 判断时,null和undefined是等同的

正确的用法:

if (typeof(abc) `==` "undefined")   

或者最简单的办法:

if(abc===undefined)

注意!!! type的用法有运算符形式和函数形式,即if (typeof(abc) == “undefined”) 和 if (typeof abc == “undefined”) 效果是一样的。另外,由于typeof会返回诸如"number"的字符串形式的结果,因此==的右操作数应注意加双引号表示字符串。

④如何检测某个变量是null:

错误的用法:

1、if(abc == null)
// 解释同上。不过:要判断abc是 null 或者 undefined 时可使用本法。
2、if ( !abc)
// 这个的原理是:abc为假值,则 ! abc为真值,条件成立。然而,假值也可能是undefined,0 或 false。不过:要判断 abc是null、undefined、0 或者false 时可使用本法。

3、if(typeof abc == "null")
// 为了向下兼容,abc 为 null 时,typeof null 总返回 object,所以不能这样判断。

4、 if ( isNull (abc) )
// VBScript 中有 IsNull 这个函数,但 JavaScript 中没有。

=============================================================================

正确的方法:
1、 if (! abc && typeof abc != "undefined" && abc != 0)

// 这个的原理是:如果!abc 成立,则 abc 为假值,则 abc 要么是undefined,0,false或者null 。typeof abc!= “undefined” 排除了 undefined;exp != 0 排除了0 和 false (0= =false,0= =0)。所以,abc一定是剩下的null。

2、最简单的方法:

 if (abc=== null)

尽管如此,我们在 DOM 应用中,一般只需要用 (! abc) 来判断就可以了,因为 DOM 应用中,可能返回 null,可能返回 undefined,如果具体判断 null 还是 undefined 会使程序过于复杂。

三. 测试对象是否存在:

在 JavaScript 中, null 用于对象, undefined 用于变量,属性和方法。
对象只有被定义才有可能为 null,否则为 undefined。因此,如果我们想测试对象是否存在,必须先检测对象是否已定义。
因此,这是错误的:
if (abc !== null && typeof abc !== “undefined”)
这是正确的:

if (typeof  abc !== "undefined" && abc!== null)

你可能感兴趣的:(JavaScript,数据类型,JavaScript)