我不确定如何正确地说出来。基本上,我想要一个由反斜杠组成的字符串,一个" escapable"字符并将其转换为实际的转义表单:
console.log(magicStringFunction('\\n') === '\n') // true
我尝试做的事实上是String.raw
:
console.log(String.raw`\n` === '\\n') // true
我知道技术上我可以使用eval
执行此操作:
console.log(eval('"\\n"')); // \n
但是,我一般都想避免使用eval。有没有办法用本机代码执行此操作?
答案 0 :(得分:0)
找到答案!只是表明在提出问题之前我需要做更多的调查......
您可以使用JSON.parse
,在这种情况下类似于eval
,但危险性较小且(我相信)更快。
console.log(JSON.parse('"\\n"') === '\n') // true
答案 1 :(得分:0)
这是您提出的解决方案之一:
function magicStringFunction(w){
return JSON.parse('"' + w + '"');
}
但是当发生这种情况时它会失败:
magicStringFunction('"\\n"'); // whoops
防止这种情况发生的版本:
function magicStringFunction(w){
return w.replace(/\\./g, function(match){
return JSON.parse('"' + match + '"');
});
}
可能效率不高但是有效。
或者,如果您不是JSON.parse的忠实粉丝,那么您可以这样做:
function magicStringFunction(w){
// Defined by Table 34 under section 11.8.4.3
// ' " \ b f n r t v
var escCharMap = {
"\\'": "'",
"\\\"": "\"",
"\\\\": "\\",
"\\b": "\b",
"\\f": "\f",
"\\n": "\n",
"\\r": "\r",
"\\t": "\t",
"\\v": "\v"
};
return w.replace(/\\./g, function(match){
if(escCharMap.hasOwnProperty(match)) return escCharMap[match];
else return match.substr(1, 1);
});
}
参考:http://www.ecma-international.org/ecma-262/7.0/index.html#prod-SingleEscapeCharacter