从用 void 0 替代 undefined 提及

Why underscore

近来最先看 underscore源码,并将 underscore源码解读 放在了我的 2016设想 中。

浏览一些有名框架类库的源码,就好像和一个个巨匠对话,你会学到许多。为何是 underscore?最主要的原因是 underscore 简短精干(约 1.5k 行),封装了 100 多个有效的要领,耦合度低,异常合适逐一要领浏览,合适楼主如许的 JavaScript 初学者。从中,你不仅能够学到用 void 0 替代 undefined 防止 undefined 被重写等一些小技能 ,也能够学到变量范例推断、函数撙节&函数去抖等经常使用的要领,还能够学到许多浏览器兼容的 hack,更能够学到作者的团体设想思绪以及 API 设想的道理(向后兼容)。

以后楼主会写一系列的文章跟人人分享在源码浏览中进修到的学问。

迎接围观~ (如果有兴致,迎接 star & watch~)您的关注是楼主继承写作的动力

Why does void 0 replace undefined

说来惭愧,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 替代掉了。

一篇不长的文章写了两个小时,心累,不点个赞、不关注下楼主的 Repo 你以为好意义吗?https://github.com/hanzichi/underscore-analysis

Read More

    原文作者:fish
    原文地址: https://segmentfault.com/a/1190000005138543
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞