Prototype源码浅析 String部分(二)


  本文标签:String

格式 camelize | capitalize |  underscore |  dasherize  | inspect          
变形 toArray |  succ  | times
这里面一个有用的方法是inspect,按照参考手册的说明,他的作用是“返回该字符串针对调试的字符串表现形式(即用单引号或双引号包括起来,并使用 \ 对特殊字符进行转义)”,在Object的toJSON里面也涉及到这个方法 。

  既然涉及到需要转义的字符,我们自然要一份转义字符信息,下面直接给出:
复制代码 代码如下:

String.specialChar = {
\b: \\b,
\t: \\t,
\n: \\n,
\f: \\f,
\r: \\r,
\\: \\\\
}

【在JSON.js里面,多了一个",因为JSON里面string里面是不能出现"的,所以需要转义】

  第一步,当然是要替换特殊的转义字符,初始版本:
复制代码 代码如下:

function inspect() {
return this.replace(/[\b\t\n\f\r\\]/,function(a){
return String.specialChar[a];
});
}

  对于JSON形式来说,双引号是必须的,因此,我们应该可以选择自己的返回形式,所以,给inspect一个参数useDoubleQuotes,默认是用单引号返回字符串的 。
复制代码 代码如下:

function inspect(useDoubleQuotes) {
var escapedString = this.replace(/[\b\t\n\f\r\\]/,function(a){
return String.specialChar[a];
});
if (useDoubleQuotes){
return " + escapedString.replace(/"/g, \\") + ";
}
return "" + escapedString.replace(//g, \\\) + "";
}

  现在这跟源码中的功能差不多,不过Prototype源码中的实现方式并不是这样的,主要区别在于escapedString这一段 。源码中直接列出来所有的控制字符,表示为[\x00-\x1f],外加\就是[\x00-\x1f\\],因此改造上面的初始版本就是:
复制代码 代码如下:

function inspect(useDoubleQuotes) {
var escapedString = this.replace(/[\x00-\x1f\\]/g, function(character) {
if (character in String.specialChar) {
return String.specialChar[character];
}
return character ;
});
if (useDoubleQuotes) return " + escapedString.replace(/"/g, \\") + ";
return "" + escapedString.replace(//g, \\\) + "";
}
[html]
附,ASCII控制字符编码表,对应\x00-\x1f: