Skip to content

Commit

Permalink
add semicolon shit
Browse files Browse the repository at this point in the history
  • Loading branch information
ft committed Sep 20, 2014
1 parent c36e245 commit f440e22
Show file tree
Hide file tree
Showing 2 changed files with 100 additions and 1 deletion.
2 changes: 1 addition & 1 deletion _posts/2014-09-14-ie6-support-method.md
Original file line number Diff line number Diff line change
Expand Up @@ -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` 这么多类型
Expand Down
99 changes: 99 additions & 0 deletions _posts/2014-09-21-why-I-like-guy-without-semicolon.md
Original file line number Diff line number Diff line change
@@ -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 语法都了如指掌, 像之前微博上说的`{} + []`问题 <http://weibo.com/2306114930/B7rrjwSgf> 更是不在话下

分号党也分为两种, 一种是他确实没思考过不写分号会怎样, 只是一直保留原有的习惯, 另一种是觉得写分号可以避免一些错误, 但非常不幸的是, 写分号的人才会搞出分号的错误, 比如下面两个例子

```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

知乎上关于这个问题有很好的讨论 <http://www.zhihu.com/question/20298345>


### 代码洁癖

代码洁癖的重要性是众所周知的, 一个没有代码洁癖的人, 往往会写出一个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 程序员高下未必准确, 但可以节省时间

0 comments on commit f440e22

Please sign in to comment.