说明:减号,中划线,dash,在本文中等同;下划线,underscore,等同。连接符,泛指连接单词的符号(故意没使用连字符/hyphen,因为连字符通常就是中划线/减号)。
下划线在上
直观的差别
视觉上,减号更平衡。而下划线的存在感更低,在http链接中甚至可能被淹没,和空格很难区分。在输入上,下划线需要多按一下 Shift 键,所以减号在便利性上加0.1分。下划线在超链接中可读性差
深入的差别
以下划线连接的字符串双击就会全部选中(注),而减号连接的字符串要全选需要用鼠标。所以下划线连接更便利,这是一些同学选择使用下划线的一个理由。
这个差别已经接近下划线和减号的本质差别了,那就是它们在分词上的差别。在计算机世界里,下划线的连接通常作为一个单词,而减号的连接不是。
注:其实并不是所有软件中都这样。随便试了一个版本的Word, 就不是这样(后面图中有)。
分词的差别
这里的单词不是英语的单词(word),计算机世界里我们通常说标识符(identifier)。在标识符里,下划线的地位和26个字母基本无差别,比数字的地位还高一点,因为数字通常不能做首字母。
在主流的正则表达式里,用来表示单词的字符,即w是这样的:[A-Za-z0-9_],也就是大小写字母,数字和下划线。注意,它不包含减号(这里的减号是用来表示范围的)。
所以,在计算机世界里,大家对于"word"所包含的字符的约定基本是一致的:包含下划线,但不包含减号。
基于这个分词原则,除了刚才的双击行为的差别,还会产生很多的差别。
排版的差别
排版的差别主要体现在自动换行时。减号会作为换行时截断的边界,而下划线通常不会。
Word中分词/换行的差别
有些考虑不周的软件,在面对超长的下划线单词时,由于不分隔还会造成溢出(超出了预期的界面区域)。
Jenkins中下划线超长溢出(上下对比)
搜索的差别
如果你的公司做了一款产品,型号叫作 mycompany_myproduct,假如文档全程都用这个代号,极端点,没有提到mycompany或myproduct这两个单词,那么,对于某些搜索引擎,通过myproduct或mycompany将搜索不到这个页面。
如果型号为mycompany-myproduct,通过mycompany和myproduct,则都是可以搜到的。在做SEO时,更需要考虑这种差异。
据说对于百度,两者的差异比较小;而对于Google,用减号连接则更有优势。毕竟多数人会倾向用 myproduct 的关键字进行搜索。
深入的逻辑
从形式和逻辑组合上,共有4种符号用来区分隔断。
形式上断开,逻辑上断开:这是全隔断,没有争议地用空格;形式上连接,逻辑上断开:姑且称弱连接,通常用减号;形式上连接,逻辑上连接:姑且称强连接,通常用下划线;形式上断开,逻辑上连接:这是反人类,容易造成错误。如果要算,中文全角空格勉强可以算一个。但这不是它的本意,它只是一些坑的来源。所以,真正有意义的组合是前3个。我们可以选择其它符号来表达这3种意思,但从外观及传统上,空格,减号,下划线,这3个符号是比较好的选择。
为什么要用下划线?
最初,我们要用下划线,是因为减号用来表示减法了。my-var 表示变量 my 减去 var;如果一个变量含有多个英语单词,为了区分它们,而你又不想用骆驼命名法MyVar,就要用下划线的my_var。大多数编程语言里都这是这样。
这种对标识符的要求会泛化,比如 Python 里 package 的名字里只能用下划线而不能用减号,从而导致作为模块的文件名不能用减号(但作为一般的不被引用的程序文件还是可以用减号的)。
这种泛化进一步蔓延到了C/C++世界里,比如Google prefer的C++文件名是下划线(尽管可以用减号)。
这种泛化最后可能会蔓延到所有需要连接单词的场景上。毕竟人们更容易接受单一的规则。
可以不用下划线的编程世界
但这不是绝对的。
LISP类语言
在能明确区分操作符和连接符的语法里,标识符就可以包含减号了,比如LISP,操作符是前置的,元素以空格或括号分隔,这样标识符就可以随意包含减号了。
(let((my-var300) (your-var100)) (print(- my-varyour-var)))上面的和下面的代码,结果都是200。"var-300", "var-100", 甚至"300-300", "1-100"都只是标识符而已,不会被当作减法表达式。只有列表里的第一个元素是减号才表示减法操作。
(let((var-300300) (var-100100)) (print(-var-300var-100))) (let((300-300300) (1-100100)) (print(-300-3001-100)))HTML世界
在XSL中,大量使用带减号的关键字,比如for-each, value-of, copy-of。同样,你自己的标识符当然也可以包含减号,比如下面代码中的my-header。
<xsl:variablename="my-header"><tr><th>Title