null VS undefined
null VS undefined
“null与undefined的区别?”
以前去淘宝面试的时候被问过这个问题,当时只是粗略的按照犀牛书上的答案讲了下,但具体的并没有深入去了解。
后来有机会去问问身边做JS开发的同事,也没有几个能说清楚的,但是经过问一些JS大牛(斐斐、玉伯),一语惊醒梦中人,先卖个关子,“一语”到最后再总结。下面先来分别了解下null和undefined:
null
来看下书上的解释:Javascript的关键字null是一个特殊的值,它表示“无值”。null常常被看作对象类型的一个特殊值,即代表“无对象”的值。null是个独一无二的值,有别于其他所有的值,如果一个变量的值为null,那么就说明它的值不是有效的对象、数组、数字、字符串和布尔值。当null用户布尔环境,它转换为false。当它用于一个数字环境,它转换为0.当它用于一个字符串环境,它转换为“null”。
恩,这段话读了N久,很容易能从中获取的信息只是null是object类型,我们alert(typeof null)就知道了。但加粗的这段文字“如果一个变量的值为null,那么就说明它的值不是有效的对象、数组、数字、字符串和布尔值”—真的比较难理解:如果一个变量的值为null,可是我并不想做这个假设,我希望知道的是什么情况下会返回null?又或者什么情况下会用到null?
我在问问斐斐这个问题时,她给了我其中一个答案:在DOM选择时,如果选择不到元素(即选择的元素为空)时,返回null:
1
|
alert(doucment.getElementById( 'xxxx' )) |
在控制台输入以上代码,点运行,会发现返回null,也就这样返回了null的值,其实从这个我们很容易总结出:当我们访问一个不存在的对象时,会返回null!
我们在读jQuery等一些JS框架源码的时候经常会看到null的赋值:data=null; 将一个变量设为null是起什么作用呢?
1
2
3
4
5
|
var a = {a1:1,a2:2,a3:3} alert(a) a= null ; b= new a(); alert(b); |
我们运行这段代码,第一次alert的是“[object object]”(请参考犀牛书P118),第二次alert的是什么呢?—第二次会出错“TypeError: a is not a constructor”。这时它返回了错误信息,说a不是一个构造函数! 我 们在第一次alert了之后尝试性的将a设为了null,然后再去实例化a,发现a不是一个构造函数了。
备注:感谢继风的指出,上面这段结论是错的,即使不给a设为null,也是返回错误
如果要将一个标识符声明成object类型,但是暂时不给他实例,那么就可以将它先初始化为null,以便以后使用。
这个大家可以联想到delete,delete可以删除指定的对象的属性、数组元素或变量,但用var语句申明的用户定义变量是不可以被删除的 (参考犀牛书P87)。但设为null却可以,恩。就是这么简单。但JS中的内存回收是可以由垃圾收集(参考犀牛书P63)自动处理的,所以不太需要太操心显式地释放内存。TIPS:但如果用到了闭包可能就释放不了了。
undefined
undefined是window对象的一个属性,它不像null是Javascript的关键字,它不是一个关键字!恩,但从ECMAScriptv3标准开始,规定了名为undefined的全局变量,它的初始值是undefined。因此在符合ECMAScript v3的Javascript的实现中,可以把undefined作为关键字处理,只要不给该变量赋值即可,
alert(typeof null)返回的是object,那么undefined会是什么类型呢?答案是undefined,恩就是这么规定的。什么情况下会返回undefined?来看下面几种情况:
- 直接访问没有修改的全局变量undefined。这条就不多说了,直接访问undefined肯定是返回undefined了。
- 访问设置为
undefined
值的变量。将变量的值设置为undefined,返回变量,很明显,肯定是undefined了 使用一个并没有申明的变量(犀牛书P45) 这一条我持怀疑态度,经本人测试,在alert并未申明的变量时,返回的不是undefined,而是出错!这个在《Javascript高级程序设计》一书中也提到了(P3-21)。这条欢迎讨论- 已经申明但没有赋值
12
var
a;
alert(a)
运行这段代码,很显然返回了undefined
- 使用了一个并不存在的对象的属性。一定要注意,这里是对象的属性,不是普通的变量神马的!
1
alert(window.xxxx)
以上代码试图使用window的xxxx属性,但实际上window对象并没有这个属性,所以这时也返回了undefined
以上几条未全,有时你在控制台输入一个函数,但没有任何显式的调用或者输出的话,这时也会返回undefined,其他欢迎补充。
第二条中提到了,我们有时会把变量的值设为undefined,为什么要设为undefined?当我们需要清空一个变量的值的时候就可以用undefined,恩,但是变量还在,值没了。
有时代码中会出现这样的代码:
1
|
typeof a === "undefined" |
这个代码的作用其实就是先判断一下这个变量是否未定义!如果返回true,那么就说明这个变量定义了。
我们在学习一些前端JS框架的过程中,会发现作者会常常自定义一个局部的undefined变量,这是为什么呢?这就要谈到关于提高 undefined性能方面的话题了,首先正如我们上面所分析的,undefined 是全局对象(window)的属性,那么当我们在程序中使用 undefined 值时,实际上使用的是window对象的undefined属性,那么当我们将一个变量或值与undefined进行比较时,javascript引擎会 遍历window所有的属性,直到找到名为’undefined’的属性为止,然后再比较两个操作数的引用指针是否一样。也就是说在遍历属性的过程中会花 费大量的时间,毕竟window对象的属性值非常的多嘛。这样,当频繁与undefined进行比较时,可能就会存在一个性能问题点了。因此,在这种情况 下,我们可以通过自定义个局部的undefined变量,来提高对undefined的比较速度。
例如:
function myFunc() { var undefined; if(x == undefined){…} }
正如上面代码所示,定义undefined局部变量时,其初始值是对window.undefined属性值的引用。在后面代码段中比较操作时,都 是在函数的作用域上进行比较的,由于函数作用域上的变量数量远远少于window对象上的属性个数,那么可想而知比较速度会得到一定提升了。
null与undefined的比较
关键字 | 类型 | 初始值 | 何时用 | |
---|---|---|---|---|
null | 是 | object | null | 引用为空时(如对象) |
undefined | ECMA V3+是 | undefined | undefined | 数值为空时(如普通变量) |
最后玉伯的一语惊醒梦中人:值类型的“虚无”,用 undefined。引用类型的“虚无”,用 null.
这2个东西很难搞,业界讨论的也不多,大家都是浅显的理解,恩,本篇文章并不详细,只是希望能够大家一起讨论,因为会用到,如果不搞清楚,很难写出很好的代码。
null VS undefined的更多相关文章
- 判断一个值是否为null或者undefined
var a=null; var b=undefined; if(a===null){ //a==null alert("a=null") }else{ alert("a= ...
- null和undefined的一些区别
读了阮一峰的博客,自己总结一下,便记录一篇博客 在javacript的基本类型中,有2种基本类型,只有1个值,便是null和undefined,都表示的是"无".在一定程度上是相等 ...
- JS中判断null、undefined与NaN的方法
写了个 str ="s"++; 然后出现Nan,找了一会. 收集资料如下判断: 1.判断undefined: 代码如下: <span style="font-siz ...
- V8 的 typeof null 返回 "undefined" 的 bug 是怎么回事
1997 年,IE 4.0 发布,带来的众多新特性中有一个对未来“影响深远”的 DOM API:document.all.在随后的 6 年里,IE 的市场占有率越来越高,直到 2003 年的 95%. ...
- 【阿里李战】解剖JavaScript中的 null 和 undefined
在JavaScript开发中,被人问到:null与undefined到底有啥区别? 一时间不好回答,特别是undefined,因为这涉及到undefined的实现原理.于是,细想之后,写下本文,请各位 ...
- null和undefined区别
undefined表示不存在的状态.没有定义的变量,没有定义的对象属性,没有return的函数的返回值等等都是undefined. null表示没有对象.使用上没有差别,只是根据大众的使用习惯,场合不 ...
- null、undefined、false、0相等性比较
之前在看<JavaScript权威指南>的时候看到三个相等性比较的式子: null == undefined ;// ==>true undefined == false;// == ...
- null和undefined区别(转)
目前,null和undefined基本是同义的,只有一些细微的差别. null表示"没有对象",即该处不应该有值.典型用法是: (1) 作为函数的参数,表示该函数的参数不是对象. ...
- 字符串怎么换行 || 字符串中使用单引号时应该怎么写 || 保留两位小数 || 数字0在if中的意思是false || 什么情况下会会报undefined || null和undefined的区别 ||
换行的字符串 "This string\nhas two lines" 字符串中使用单引号时应该怎么写 'You\'re right, it can\'t be a quote' ...
- js笔记——js里的null和undefined
以下内容摘录自阮一峰的<语法概述 -- JavaScript 标准参考教程(alpha)>章节『5.null和undefined』,以做备忘. null与undefined都可以表示&qu ...
随机推荐
- ■Ascii逐字解码法注入,mysql5.0一下版本手工注入
/*By:珍惜少年时*/ 逐字解码法,不一定非要猜字段内容.库名,表名,字段,data,都能猜. 环境过滤了select.union(mysql5.0以下的版本就不支持union所以也可以用此方法), ...
- Python序列切片的注意事项
a=[1,2,3,4,5,6,7,8,9,10] 1)普通切片,形如array[m:n],只包含起始索引m,和不被包含在结果内的终点索引n, 注意终点索引可以大于序列的大小(长度),若终点索引大于序列 ...
- eclipse内存设置,tomcat内存设置,查看内存大小
首先可以通过java/jdk/bin下的java visualVM查看eclipse的内存大小和tomcat的内存大小,主要看堆,PermGen两个大小 如图: 多数情况下,eclipse抛出内存溢出 ...
- A + B Problem
Write a function that add two numbers A and B. You should not use + or any arithmetic operators. 分析: ...
- Dom lesson1
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 对Java中字符串的进一步理解
字符串在程序开发中无处不在,也是用户交互所涉及到最频繁的数据类型,那么字符串不仅仅就是我们简单的理解的String str = "abc";一起来更加深入的看一下 在Java中,字 ...
- 写了一个字符串的二维表: TSta
STA 单元 (用到 System.SysUtils.TStringHelper): --------------------------------------------------------- ...
- Python多线程(3)——Queue模块
Queue模块支持先进先出(FIFO)队列,支持多线程的访问,包括一个主要的类型(Queue)和两个异常类(exception classes). Python 2 中的Queue模块在Python ...
- Servlet之Cookie操作
Java对cookie的操作比较简单,主要介绍下建立cookie和读取cookie,以及如何设定cookie的生命周期和cookie的路径问题. 1,建立一个无生命周期的cookie,即随着浏览器的关 ...
- 安装qmake与环境变量解析
转自:http://www.kuqin.com/qtdocument/qmake-manual-2.html 安装qmake 当Qt被连编的时候,默认情况下qmake也会被连编. 这一部分解释如何手工 ...