前言源码链接这是underscore.js源码解析的第一篇文章。为什么选择写这篇文章?其实源码中主要有两个下划线。obj===void0的判断贯穿整个源码。第一次看到这个写法,不知道是什么意思,就想了解一下。我决定写一个系列来彻底分析下划线。希望由浅入深,软软的捡柿子,先从简单的开始(?)写完这篇文章希望达到什么样的效果?解释为什么在一些简单的应用中使用(void0)而不是undefined(void0)。什么是void0,什么是void0?为什么可以直接替换undefined关键字进行判断呢?我们可以看看mdn上的解释void运算符对给定的表达式求值然后返回undefined。void运算符计算给定的表达式然后返回undefined什么?执行某个表达式,最后得到undefined,如果表达式执行的结果是2、3、8,毛主席万岁,会不会也返回undefined?答案是:是的。他就是这么个东西,不管你表情写什么,最后我都给你undefined。什么是未定义的?undefined是js原有的类型值之一,也是全局对象window的一个属性。可以在一些低级浏览器中修改,也可以在本地范围内修改。首先我们看一下这段破代码varundefined='qianlongo'alert(undefined)最后的控制台输出是什么?undefined:qianlongo,如果没有图片,你说js,然后浏览器运行后截图一些。ie7ie8ie9的测试结果未定义。ie10chrome测试结果在最新版本58.0.3029.81未定义。firefox最新52.0.2版本测试结果未定。浏览器最新版本39.0.2256.48测试结果未定。可见老版本的ie就是这么任性。你可以直接在全局范围内改写undefined。也就是说,当你想知道一个变量是否等于undefined时,只做这个判断已经不安全了。if(obj===undefined){//xxx}接下来我们再看一个jsvartestUndefined=function(){varobj={}varundefined='undescore'varwindow={'undefined':'qianlongo'}console.log(window)//{'undefined':'qianlongo'}console.log(undefined)//下划线console.log(window.undefined)//qianlongoconsole.log(obj.name===undefined)//falseconsole.log(obj.name===window.undefined)//falseconsole.log(obj.name===(void0))//true}testUndefined()可以断定window,undefined本身就是本地的作用域可以重写。同样的道理,如果在局部范围内也使用下面的代码来判断obj是否undefined,也是有风险的。if(obj===undefined){//xxx}为什么要用void0而不是undefined为什么要用void0而不是undefined,根据上面的介绍,原因就在这里,void0不管何时何地,接下来,结果是未定义的,这正是我们所需要的。所以改写上面的判断,当然void0比undefined短还有一个原因if(obj===void0){//xxx}void0的一些其他应用填充a标签的href
