今天学习闭包时突然发现,手动释放内存是让变量 = 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.相似性
undefined
和null
在if语句中,都会被自动转为false
,同时undefined == null
2.历史原因
作者觉得要加
undefined
(自己看阮一峰先生的解释)
3.最初设计
null
表述“无”的对象,转换为数值是0;undefined
表述“无”的原始值,转换为数值是NaN。
4.目前用法
经过实践,上面的区分被证明不行。null
表示“没有对象,即该处不应该有值”。典型用法:
- 作为函数的参数,表示该函数的参数不是对象。
- 作为对象原型链的终点。(所有对象的原型链终点指向
null
,Object.prototype.__proto__ === null
)
|
|
undefiend
表示“缺少值”,就是此处应该有一个值,但是还没有定义。典型用法:
- 变量被声明了,但没有赋值,此时就是undefined
- 调用函数时,应该提供的参数没有提供,该参数等于
undefined
- 对象没有赋值的属性,该属性的值为
undefined
- 函数没有返回值时,默认返回
undefined
|
|
null 表示一个值被定义了,定义为“空值”;
undefined 表示根本不存在定义。(注意“不存在”三字)
所以设置一个值为 null 是合理的,如
objA.valueA = null;
但设置一个值为 undefined 是不合理的,如
objA.valueA = undefined; // 应该直接使用 delete objA.valueA; 任何一个存在引用的变量值为undefined都是一件错误的事情。
闭包具有保存变量内存的功能,内存被占用,这就是为什么有时候垃圾回收对它无效。而将变量赋值为null
,消除该变量对值的引用,该变量被赋值为空,自然不存在先前的引用了。