Prototype源码浅析 String部分(二) |
||||
本文标签:String
既然涉及到需要转义的字符,我们自然要一份转义字符信息,下面直接给出: 复制代码 代码如下: 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: |