这个题目其实有点标题党了,其实本篇文章主要内容应该是说“代码中的美元符号(dollar sign)”。想总结一下我所看到的美元符号在代码中的起到的作用,当然了并不是说它作为格式化字符时出现在数字前当钱币单位的作用。
有效的变量名
在取变量名的时候,我们通常都只使用字母,数字,下划线,而且数字不能作为开头。但是在很多编程语言中,对于变量名的限定更宽泛,很多特殊字符也可以作为变量名,当然也包括$。
JavaScript
JavaScript允许$符号作为有效的识别来当做变量名或者方法名来使用。最著名的例子就是jQuery了,整个使用过程中到处都是$。$只是jQuery变量的一个别名,但是也正式$的短小、高可识别度,在编写代码时带来了很多的便利。
[codesyntax lang=”javascript” lines=”normal”]
$("button").click(function () { $("p").toggle(); });
[/codesyntax]
对于还能用哪些奇怪的字符作为JavaScript的变量,可以通过JavaScript variable name validator来检验有效性。
Java
Java其实也可以将$作为有效的变量,只是它不能作为用户定义,而是预留给编译器使用。
Variable names are case-sensitive. A variable’s name can be any legal identifier — an unlimited-length sequence of Unicode letters and digits, beginning with a letter, the dollar sign “
$
“, or the underscore character “_
“. The convention, however, is to always begin your variable names with a letter, not “$
” or “_
“. Additionally, the dollar sign character, by convention, is never used at all. You may find some situations where auto-generated names will contain the dollar sign, but your variable names should always avoid using it. A similar convention exists for the underscore character; while it’s technically legal to begin your variable’s name with “_
“, this practice is discouraged. White space is not permitted.
比如说嵌套类(nested class),在编译过后实际的类名都是各层嵌套类以$为分隔符“粘合”在一起。看看下边的简单示例:
[codesyntax lang=”java” lines=”normal”]
package com.ider; public class Dollar { static class Sign { } public static void main(String[] args) { Dollar.Sign sign = new Dollar.Sign(); System.out.println(sign.getClass().getName()); } }
[/codesyntax]
输出结果为:
//com.ider.Dollar$Sign
占位转义
正则表达式
$在正则表达式中,代表字符串的结尾位置。比如下边的表达式就是用来检查字符串是否以数字结尾的句子。
[codesyntax lang=”javascript” lines=”normal”]
var reg = /\d$/; reg.test(str);
[/codesyntax]
在一些正则表达式的实现中,$还可以作为表达式分隔符(delimiter)以表示所包裹的内容是表达式的一部分,比如PHP就是如此:
[codesyntax lang=”php” lines=”normal”]
//match string that contain 'php' $pattern = '$php$'; preg_match($pattern, $subject, $matches);
[/codesyntax]
只是表达式的内容部分若遇到要用$,就不得不用斜杠(\)来转义了,如果又要让其真实去匹配$符号而非结尾,又要进一步转义,然后就晕了。所以一般并不会使用$来做分隔符。一般还是会用反斜杠(/)来拼配JavaScript的格式,或者用#因为它被使用到较少。
正则表达式除了可以匹配,更重要的是用来替换,而替换中最强大的就是向后引用(Back-Reference)。多数支持正则表达式的文本编辑器都会使用反斜杠加数字(\1, \2, \3 …)来表示向后引用的匹配内容。不过JavaScript则用$加数字来($1, $2, $3 …)表示。
[codesyntax lang=”javascript” lines=”normal”]
var friends = 'friends of Ider, friend of Angie'; var result = friends.replace(/(friends?) of (\w+)/g, "$2's $1");
[/codesyntax]
这个在《JavaScript字符串操作的偏方怪法》中有过介绍。
CSS
CSS的属性选择器(Attribute Selector),不仅可以针对包含了指定属性的标签进行样式设置,还能针对属性所包含的内容。其中一个就是指定属性内容是以什么为结尾的,这与正则表达式很相似,同样也很好用。比如希望针对jpg格式的图片添加边框让她看起来像画框,就可以
[codesyntax lang=”css” lines=”normal”]
img[src$= ".jpg"] { border: 10px solid #DDDDDD; }
[/codesyntax]
取变量内容
PHP
在PHP的变量中,总是会带有$符号(define的常量除外),它可以看做是PHP变量的一部分,但是不严格地说它更像是取变量所包含的内容。比如下边的代码:
[codesyntax lang=”php” lines=”normal”]
$x=7; $y="x"; echo $$y;
[/codesyntax]
其结果是
7
第一个$去了y中的内容为x,第二个$取了x中的内容为7。另外->也可以理解以对象为目标取内容。
不只是PHP,Shell Script、Perl也是一样的处理,像Shell Script就比较全别,不带$的语句进行变量赋值,使用$来获取变量的内容。
其它
Bash Shell
Bash Shell里面,$常常会被用来当做指令提示字元(Command Prompt)。我们也可以修改环境变量PS1来改变提示字元。
此外,$除了之前提到的当做取变量的内容外,同时也是一个变量,它保存的是当前进程id。
iBatis
这是一个Java的ORM框架,不过我第一次接触它是移植在.net平台上的iBatis.net。在这个框架里,用$包裹变量则表示要对其内容进行转义以防止SQL注入攻击。或者使用#不进行转义。
Visual FoxPro
用cSearchFor $ cSearchIn
来检查字符式是否出现在另一个字符式中出现。
其它的其它
还有其它代码中你看到$的不同用法,欢迎补充。不知道¥符号是否也能在代码中有不同的功能呢。
1 Comment