从用 void 0 代替 undefined 提及

Why underscoregit

最近开始看 underscore源码,并将 underscore源码解读 放在了个人 2016计划 中。github

阅读一些著名框架类库的源码,就好像和一个个大师对话,你会学到不少。为何是 underscore?最主要的缘由是 underscore 简短精悍(约 1.5k 行),封装了 100 多个有用的方法,耦合度低,很是适合逐个方法阅读,适合楼主这样的 JavaScript 初学者。从中,你不只能够学到用 void 0 代替 undefined 避免 undefined 被重写等一些小技巧 ,也能够学到变量类型判断、函数节流&函数去抖等经常使用的方法,还能够学到不少浏览器兼容的 hack,更能够学到做者的总体设计思路以及 API 设计的原理(向后兼容)。chrome

以后楼主会写一系列的文章跟你们分享在源码阅读中学习到的知识。express

欢迎围观~ (若是有兴趣,欢迎 star & watch~)您的关注是楼主继续写做的动力框架


Why does void 0 replace undefined
ide

说来惭愧,underscore 源码解读这个 Repo 放在 Github 都已经 20 天没有更新了,要不是今天 “不当心” 注意到,我竟然都快忘了(是否是 lu 多了),因此今晚不管如何都要 lu 出第一篇(毕竟万事开头难)。相对于其余源码解读的文章,基本都会从总体设计开始讲起,楼主以为 underscore 这个库有点特殊,so 决定按照本身的思路,从用 void 0 代替 undefined 提及。函数

underscore 源码没有出现 undefined(注意,其实有出现一处,是为 “undefined”,而不是 undefined),而用 void 0 代替之。为何要这么作?咱们能够从两部分解读,其一是 undefined 哪里很差了,你非得找个替代品?其二就是替代品为毛要找 void 0?工具

咱们先看第一点,答案很简单,undefined 并非保留词(reserved word),它只是全局对象的一个属性,在低版本 IE 中能被重写。学习

var undefined = 10;

// undefined -- chrome

// 10 -- IE 8

alert(undefined);

事实上,undefined 在 ES5 中已是全局对象的一个只读(read-only)属性了,它不能被重写。可是在局部做用域中,仍是能够被重写的。

(function() {

  var undefined = 10;

  // 10 -- chrome

  alert(undefined);

})();

(function() {

  undefined = 10;

  // undefined -- chrome

  alert(undefined);

})();

接下来思考第二个问题,为毛找的替代品是 void 0?

咱们来看看 MDN 的解释:

The void operator evaluates the given expression and then returns undefined.

意思是说 void 运算符能对给定的表达式进行求值,而后返回 undefined。也就是说,void 后面你随便跟上一个表达式,返回的都是 undefined,都能完美代替 undefined!那么,这其中最短的是什么呢?毫无疑问就是 void 0 了。其实用 void 1,void (1+1),void (0) 或者 void “hello”,void (new Date()) 等等,都是同样的效果。更重要的前提是,void 是不能被重写的(cannot be overidden)。

那么,ES5 大环境下,void 0 就没有用武之地了吗?答案是否认的,用 void 0 代替 undefined 能节省很多字节的大小,事实上,很多 JavaScript 压缩工具在压缩过程当中,正是将 undefined 用 void 0 代替掉了。

相关文章
相关标签/搜索