前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >null 和 undefined

null 和 undefined

作者头像
Chor
发布2019-11-08 00:35:37
1.7K0
发布2019-11-08 00:35:37
举报
文章被收录于专栏:前端之旅

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

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

var aa; alert(aa);

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

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

alert(aa);

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

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

alert(typeof aa);

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

二. null和undefined:

代码语言:javascript
复制
alert(undefined == null); // 返回 true

对于 undefinednull 的相等性测试,返回 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。

代码语言:javascript
复制
Number(undefined)
// NaN
5 + undefined
// NaN

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

① null

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

代码语言:javascript
复制
Object.getPrototypeOf(Object.prototype) // null    
typeof null     // object

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

代码语言:javascript
复制
if(abc != null){
//对abc执行某些操作
}

② undefined

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

代码语言:javascript
复制
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

错误的用法:

代码语言:javascript
复制
if(abc==undefined)        
// 正如上面所说,js规定用`==` 判断时,null和undefined是等同的

正确的用法:

代码语言:javascript
复制
if (typeof(abc) `==` "undefined")   
或者最简单的办法:
if(abc===undefined)

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

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

错误的用法:

代码语言:javascript
复制
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 中没有。

正确的用法:

代码语言: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)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-02-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一. undefined在变量声明中的体现:
  • 二. null和undefined:
  • 三. 测试对象是否存在:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档