js null和undefined

今天学习闭包时突然发现,手动释放内存是让变量 = null,而不是undefined,突然就有了为什么不用undefined这种想法。
这就需要我将null和undefined好好理解一番了。
主要参考阮一峰先生的文章:http://www.ruanyifeng.com/blog/2014/03/undefined-vs-null.html
还可以看看MDN:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/null

1.相似性

undefinednull在if语句中,都会被自动转为false,同时undefined == null

2.历史原因

作者觉得要加undefined(自己看阮一峰先生的解释)

3.最初设计

null表述“无”的对象,转换为数值是0;
undefined表述“无”的原始值,转换为数值是NaN。

4.目前用法

经过实践,上面的区分被证明不行。
null表示“没有对象,即该处不应该有值”。典型用法:

  • 作为函数的参数,表示该函数的参数不是对象。
  • 作为对象原型链的终点。(所有对象的原型链终点指向null,Object.prototype.__proto__ === null)
1
2
Object.getPrototypeOf(Object.prototype)
// null

undefiend表示“缺少值”,就是此处应该有一个值,但是还没有定义。典型用法:

  • 变量被声明了,但没有赋值,此时就是undefined
  • 调用函数时,应该提供的参数没有提供,该参数等于undefined
  • 对象没有赋值的属性,该属性的值为undefined
  • 函数没有返回值时,默认返回undefined
1
2
3
4
5
6
7
8
var i;
i // undefined
function f(x){console.log(x)}
f() // undefined
var o = new Object();
o.p // undefined
var x = f();
x // undefined

null 表示一个值被定义了,定义为“空值”;
undefined 表示根本不存在定义。(注意“不存在”三字)
所以设置一个值为 null 是合理的,如
objA.valueA = null;
但设置一个值为 undefined 是不合理的,如
objA.valueA = undefined; // 应该直接使用 delete objA.valueA; 任何一个存在引用的变量值为undefined都是一件错误的事情。

闭包具有保存变量内存的功能,内存被占用,这就是为什么有时候垃圾回收对它无效。而将变量赋值为null,消除该变量对值的引用,该变量被赋值为空,自然不存在先前的引用了。

Newer Post

java覆盖方法初始化

当实现或继承一个方法并且覆盖它本身的方法时,如果覆盖的是init()方法,记得初始化,否则会出现空指针异常!!!例子:12345678910111213141516public abstract class MyGenericServlet implements Servlet, ServletCo …

继续阅读
Older Post

js 作用域及作用域链

参考《JavaScript高级程序设计》 执行环境及作用域全局执行环境是最外围的执行环境。在Web浏览器中,全局执行环境被认为是window对象,因此所有全局变量和函数都是作为window对象的属性和方法创建的。每个函数都有自己的执行环境。ECMAScript的执行流机制,当执行流进入一个函数时,函 …

继续阅读