如何在JavaScript中手动转义字符

时间:2016-09-03 22:15:16

标签: javascript string escaping

我不确定如何正确地说出来。基本上,我想要一个由反斜杠组成的字符串,一个" escapable"字符并将其转换为实际的转义表单:

console.log(magicStringFunction('\\n') === '\n') // true

我尝试做的事实上是String.raw

的倒数
console.log(String.raw`\n` === '\\n') // true

我知道技术上我可以使用eval执行此操作:

console.log(eval('"\\n"')); // \n

但是,我一般都想避免使用eval。有没有办法用本机代码执行此操作?

2 个答案:

答案 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