首页 > 关于HyperDown的JS代码的一些疑问

关于HyperDown的JS代码的一些疑问

自己的个人网站需要一个markdown编辑器,就决定把HyperDown的代码拉下来改改。
因为自己并不会CoffeeScript,就直接阅读转换出来的JavaScript代码了,但自己对JS并不很熟悉,看到一些奇怪的写法,想知道这些是有特殊意义的,还是CoffeeScript生成的冗余代码:

  1. 841行: lines = lines.slice(0); 其中lines是一个数组,请问这句话是否有意义?

  2. 863行: if (!!matches){...} matches是可能为null的数组,这里可否去掉两个感叹号?

  3. CoffeeScript支持参数默认值的写法,转换出来的JS代码会变成if(x==null) x=default_var;,感觉语义上很奇怪,能否改成去判断if(x===undefined)

  4. 转换出来的JS代码中,在很多不必要的地方使用了call(),请问call()相对于常规的写法,会影响性能么?

  5. HyperDown有一个JS版和一个PHP版,分别用于前端和后端的解析,但我觉得同时维护两个版本非常麻烦,后端解析可以通过nodejs直接使用JS版来完成,请问HyperDown这样的做法是出于什么考虑?(也许是考虑到虚拟主机不能使用nodejs?)


1. lines = lines.slice(0)

slice 是返回指定数组指定位置的元素组成的新数组,详情参阅 MDN 上的 Array.prototype.slice()

2. if (!!matches){...}

!! 只是显式的把 matches 转换为 boolean 类型,就这里的语义上来说,去掉没有影响。

3. 默认值写法

x == null 包含了 x === void (0)x === null 两种情况(注意等号的数量)。

通常情况下宁愿用 typeof(x) === "undefined" 也不会直接判断 x === undefined,因为 undefined 是一个变量,可以重新定义的。void (0) 的结果是真正意义的 undefined,所以常用这个去处结果来代替 undefined

4. call() 的性能影响

有没有性能影响我不清楚,不过猜测应该会有一点。不过既然是从 CoffeeScript 翻译过来的,总会有一些东西并不会是最优。如果对实现运行效果没有啥影响,或者看不出来影响,就不要太在意。

5. JS 和 PHP 两个版本的问题

这个可能还是 SegmentFault 官方来回答比较准确。不过我猜测是因为后端使用 PHP 实现,所以用 PHP 写了一个版本,但是如果前端即时预览也通过提交到后台来处理,效率会非常低,所以又写了一套 JS 来处理。当然后来也可以通过 NodeJS 来使用 JS 库,不过估计 PHP 和 NodeJS 的配合也不是说想搞就搞的,总还是有些麻烦,所以就暂时维持成这样了。

【热门文章】
【热门文章】