diff --git a/_posts/2014-09-14-ie6-support-method.md b/_posts/2014-09-14-ie6-support-method.md index 0550fc1..5923093 100644 --- a/_posts/2014-09-14-ie6-support-method.md +++ b/_posts/2014-09-14-ie6-support-method.md @@ -84,7 +84,7 @@ function makeArray(arr, ret) { 也是非常实用, 在记录一个常用的类型判断方法 ```javascript -;{}.toString.call(arg) +var type = {}.toString.call(arg) ``` 可以检测出 `Boolean Number String Function Array Date RegExp Object Error` 这么多类型 diff --git a/_posts/2014-09-21-why-I-like-guy-without-semicolon.md b/_posts/2014-09-21-why-I-like-guy-without-semicolon.md new file mode 100644 index 0000000..dfc85fb --- /dev/null +++ b/_posts/2014-09-21-why-I-like-guy-without-semicolon.md @@ -0,0 +1,99 @@ +--- +layout: post +title: 为什么我只想和不写分号的人合作 +tags: +- javascript +--- + +经常和网友或者朋友产生一些争论, 比如是否使用分号, 是否使用类, 是否使用空格缩进 + + +### 水平高下 + +我喜欢和不写分号的人合作, 并不是说 *不写分号的人* 绝对比 *写分号的人*厉害, 肯定有人说了. 这只是一个习惯问题, 本来就看不出谁更厉害啊 + +但事情并没有这么简单, 还记得半年前在微博和知乎爆发的一场争论: **简历是否可以使用qq邮箱?**, 当时我是站在**qq邮箱**这一方的, 反对方大多是 gmail 教徒, 因为我并不喜欢 google, 而且我眼中的 gmail 也并不如qq邮箱体验好, 再加上 gmail 有时还需要科学上网, 而qq邮箱直接关联微信, 因此当时我认为qq邮箱完爆 gmail + +但我犯了一个明显的错误, 就是问题问的是: "投简历是否可以用qq邮箱", 我一直充当的是投简历一方的角色, 后来才知道, 收简历方经常会收到上百封求职邮件, 在邮件过滤上经常会感到苦恼, 其中一个方法就是过滤掉发送方为qq邮箱的人, 为什么呢? 因为用qq邮箱的大多比较 low, 还有一些是乡村非主流, 连名字都是用的火星文, 这显然和还会科学上网发 gmail 的人不能比, 因此 hr 情愿错过像我这么优秀的人才, 也要删掉100封这样的qq邮箱求职信 + +qq邮件这个例子我想说的就是, 用不写分号来过滤人才同样是个简单粗暴的方法 + +不写分号是如何区分高下的 +--- + +不写分号区分高下主要分两点, 一个是对 javascript 本身的**语法理解**, 另一个是**代码洁癖** + +### 语法理解 + +不写分号的人普遍比写分号的更懂 js, 从我认识的 js 开发者来说就是这样分布的, 我尝试说服别人不用分号的时候, 惊讶的发现他连 ASI 都不知道, 而我认识不写分号的朋友, 对各种 js 语法都了如指掌, 像之前微博上说的`{} + []`问题 更是不在话下 + +分号党也分为两种, 一种是他确实没思考过不写分号会怎样, 只是一直保留原有的习惯, 另一种是觉得写分号可以避免一些错误, 但非常不幸的是, 写分号的人才会搞出分号的错误, 比如下面两个例子 + +```javascript +var func = function() { + ... +} + +[1, 2, 3].forEach(function() { + ... +}) +``` + +这个问题在于开发者写着很长的赋值函数变量语句时, 当成函数声明忘了写分号, 因此会直接导致报错 + +```javascript +(function() { + ... +})() +``` + +这是所谓的立即执行, 看起来这并没有错, 但如果你使用 concat 来打包 js 的话, 如何去保证上面的人是写分号的呢, 只要前面的人写出 `a = b` +或者几乎是所有语句, 都可以让这段 js 报错, 因此正确的做法是 + +```javascript +void function() { + +}() + +// or +!function() { + +}() + +// or 最弱的 +;(function() { + +})() +``` + +事实上, js 程序员应该对行首的括号和正则感到敏感 + +``` +[1, 2, 3].forEach() +{}.toString.call +``` + +当然, 上述两种句首括号也是不同的情况, 第一种是分号问题, 可以通过加分号解决. 下面那个是肯定出错, 因为`{}`优先解释为 block + +知乎上关于这个问题有很好的讨论 + + +### 代码洁癖 + +代码洁癖的重要性是众所周知的, 一个没有代码洁癖的人, 往往会写出一个200行的函数, 一个800行的文件, 可以把一个简单的业务逻辑工程化, 写到几千上万行. 因此公司面试经常会问一些代码风格问题, 或者直接的问你有没有代码洁癖, 因为可持续, 可维护是公司非常看重的东西, 一个复杂的, 加入自己错误价值观的程序是无法维护的, 早晚会被后面接盘的人重构, 而一个轻巧的模块, 一个绝妙的 api, 可以不断的流传下去 + +扯远了, 为什么分号和代码洁癖有关呢, 这也是一个和 qq邮箱 类似的道理, 并不是所有写分号的人都没有代码洁癖, 只是碰巧我遇到的写分号的人往往没有 + +如果一个人已经知道了 ASI, 以及不能在行首写符号这些, 又懂得 js 基本的 grammar, 却依然固执的写分号, 那他可能就是技术没问题, 但是个没有代码洁癖的人, 这时候就要小心了, 觉得写分号不脏的, 很有可能就会写出像 java 那样十几个字符长的函数名, 甚至是写出大量大写字母, 以及类框架的代码, javascript 的创始人就是不写分号的 + +写分号的代码和不写分号的代码整洁程度差多少呢? 大家可以去看看 github 上 [zepto](https://github.com/madrobby/zepto) 和 [jQuery](https://github.com/jquery/jquery), 这两个项目代码风格都不好, 但 zepto 还是比较靠近最近的常规代码风格的, 可以单从整洁程度上看, zepto 就已经完爆了 jQuery + +其实这些所谓的**风格问题**, 早就有了最佳实践 + +我一直是认为越晚出的语言越好, 比如 google 的 golang 和 apple 的 swift, 原因很简单, 新出的语言不是升级, 不会有任何历史包袱, 其次, 后出的语言肯定知道前辈们有什么缺点会改进啊, 因此最新语言的风格我觉得就是最佳实践 + +可以发现 golang 和 swift 有不少语法是非常像的, 这也是说明最佳实践都是唯一的, 并不是一个风格自选的 option + +golang 有工具 gofmt, 其实就是代码风格的强制统一, 比如控制流的空格啊, 缩进为 tab 啊(本来可以通过配置改成空格, 现在不可以了), 还有去分号啊, 而我作为一个人肉 formatter, 可以写出与 gofmt 重合的代码 + +总结下来说, 直接通过是否写分号来判断 javascript 程序员高下未必准确, 但可以节省时间