自己的个人网站需要一个markdown编辑器,就决定把HyperDown的代码拉下来改改。
因为自己并不会CoffeeScript
,就直接阅读转换出来的JavaScript
代码了,但自己对JS并不很熟悉,看到一些奇怪的写法,想知道这些是有特殊意义的,还是CoffeeScript
生成的冗余代码:
841行: lines = lines.slice(0);
其中lines是一个数组,请问这句话是否有意义?863行: if (!!matches){...}
matches是可能为null的数组,这里可否去掉两个感叹号?CoffeeScript
支持参数默认值的写法,转换出来的JS代码会变成if(x==null) x=default_var;
,感觉语义上很奇怪,能否改成去判断if(x===undefined)
转换出来的JS代码中,在很多不必要的地方使用了
call()
,请问call()
相对于常规的写法,会影响性能么?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 的配合也不是说想搞就搞的,总还是有些麻烦,所以就暂时维持成这样了。