我正在编写JScript
以使用Windows Script Host
运行。
假设我有一个简单的字符串变量:
s1 = '\n'
我想从两个独立的字符构建s2
:\
& n
。
天真地我想这样做:
s2 = '';
s2 += '\\';
s2 += 'n';
但这当然会导致s1 != s2
我能否以s2
具有相同解释含义的方式构建s1
?
WScript.Echo("1\n2")
var s;
s += '1';
s += '\\';
s += 'n';
s += '2';
WScript.Echo(s)
我希望WScript.Echo()
同时打印完全相同的内容。
我很清楚这个问题似乎完全是愚蠢的。我可能会认为在不知道所有细节的情况下我也读过它。我不希望任何人理解目的。只是想知道它是否可行还是我需要重新考虑整个事情。
答案 0 :(得分:3)
您不能通过附加直接构建它,但是您可以在其中使用包含转义序列的字符串并将其解析为包含转义字符的字符串。在这种情况下,您可能会使用JSON.parse
:
var s1 = '\n',
s2 = '' + '\\' + 'n'; // '\\n'
console.log(s1 == JSON.parse('"' + s2 + '"')) // true
答案 1 :(得分:2)
你不能,这是不可能的。您不能将两个或多个字符连接在一起以产生一个字符,这就是\n
。它是一个包含一个单个字符的字符串。
答案 2 :(得分:0)
我仍然不清楚你实际上想要完成什么。但是,如果您说您有一些像var s1 = '\n\r\t';
这样的任意字符串,并且您希望从中生成 literal 字符串"\n\r\t"
,那么当您解析时字面值你得到一个等于原始字符串的结果,也许你可以尝试这样的事情:
window.specialChars = {
8: "\\b", //backspace
9: "\\t", //tab
10: "\\n", //newline
12: "\\f", //form-feed
13: "\\r", //carriage return
39: "\\'", //single-quote
92: "\\\\" //literal backslash
};
function escapedString(source) {
if (! source) {
return undefined;
}
var result = "";
for (var index = 0; index < source.length; index++) {
var code = source.charCodeAt(index);
result += specialChars[code] ? specialChars[code] : String.fromCharCode(code);
}
return result;
};
http://jsfiddle.net/L4L16xwu/3/
当然,您可能会遇到许多问题。特别是如果您的源字符串可能包含非ASCII字符或虚假转义序列(例如,var s1 = '\q';
是有效的JavaScript,并且会在"q"
中存储s1
的值,并且在处理那些& #39;无法判断原始源字符串中是否存在虚假\
。
可能有一个更好的替代方案来解决你试图解决的任何潜在问题&#34;解开字符串&#34;做法。
答案 3 :(得分:0)
我实际上今天有必要这样做。特别是,我需要它来构建int 21
int 0
boolean false
boolean false
或\x39
形式的八进制和十六进制转义序列。
我使用的方法只是使用\123
:
eval
这是一个合理的通用解决方案。对于八进制和十六进制代码,最好将字符串解析为int,然后从中构建一个字符串
var str = eval('"\\x' + '3' + '9' +'"') // str === "9"