上面的代码首先处理了两个特殊情况:如果大于一个月则显示”more than a month“,如果大于一个星期显示对应大于的星期数。然后分别处理特定的天数,小时和秒。如果小于则直接省去天数,小时和秒的处理方法也如此。

  虽然这段代码看起来比较合理,但是使用之后你会马上发现一些问题。8天之前这样的日期会导致"and undefined"这样的结果。采用console.log方法进行调试,我们需要记录一些变量的值来判断什么地方出现问题。比如,通过记录不同的单位,我们可以发现单位部分出了问题,因为日期字符串还可能包含时区,那么,ok,把这个问题修复掉:(此处作者将时区部分的字符串都替换成空字符串,其实还应该包括以“-”开头的情况,此处为个人理解,如有异议可以联系我o(∩_∩)o)

  var diff = new Date(datetime.replace(/+.*/, "")) - new Date();把日期的单位问题解决后,我们可以得到“1 week ago”这样的答案。然后我们可以将这个插件加入到产品中,然后继续做其他开发工作。

  第二天,有人告知我们说“3 days,80hours,4854minutes and 2912777 seconds”这样的结果是不可接受的。而造成这样结果的原因是我们没有对小于一周的日期进行处理。再次使用console.log进行调试,此刻我们的代码中已经充满了log语句(或许包括了以前已经清理过的log语句),后发现不同分支中剩余的差值没有被重新计算:

if (diff > measure) {
 num = Math.floor(diff / measure);
 diff = diff - (num * measure); // BUG: This was missing in our first attempt
 pieces.push(format(num, consider[i]));
}

  现在我们已经定位并解决了这个bug,现在要做的是去掉console.log语句,避免代码在那些不支持console对象的浏览器中报错。

  断点调试

  通过使用Firebug和一些类似的工具都可以轻易地实现对脚本的断点调试。但是大部分人还是认为console.log已经足够好用,特别是和alert进行对比之后。确实,console不会阻塞UI,并且会让你觉得不需要太接近浏览器层面,但是它也只能做到如此。console.log调试和alert调试法基本类似,有优雅之处,一样也有不优雅之处。

  一个更加复杂的方法是使用断点调试。

  使用断点调试的时候,你可以设置一些断点,然后查看所有相关变量,而不需要把变量一个一个记录下来。

  console.log带来的问题

  console.log式调试有一些问题。首先,console.log本身可能会带来一些问题。如果你曾经忘记在重要的demo或者部署中移除调试代码,你肯定知道我说的是什么。如果浏览器不支持console对象,代码会报错,包括在没有打开firebug的Firefox中。“但是JavaScript是灵活的”,你可能会这么说。“你可以自己定义一个没有操作的console对象,然后这些问题解决了”。确实,你可以这么做,但这像是你通过刷一层油漆的方式来解决车子生锈的问题。

  如果使用console.log的方式不可接受,那么我们马上会意识到下一个问题:。一旦一个调试策略已经定论,你可以去掉所有的log语句。如果新的问题在同一处代码中出现,你还是回到了原来的方式,将原来美好的log语句重新引入。断点调试肯定是一个临时方案。特设调试都是耗时,易于出错并且不可重复的解决方案。