JavaScript支持逐字字符串吗?
在C#中,可以使用如下逐字字符串:JavaScript支持逐字字符串吗?,javascript,string,Javascript,String,在C#中,可以使用如下逐字字符串: @"\\server\share\file.txt" JavaScript中有类似的东西吗?不,JavaScript中不支持。这种解决方法似乎很有问题,因为您现在失去了使用正向斜杠的能力 当我需要从ASP.NET后端构建警报消息或其他东西,并将其粘贴到前端的JavaScript警报中时,我自己也遇到了这个问题。问题是开发人员可以在Page.Alert()方法中输入任何内容 我解决这个问题的方法如下: public void Alert(string mess
@"\\server\share\file.txt"
JavaScript中有类似的东西吗?不,JavaScript中不支持。这种解决方法似乎很有问题,因为您现在失去了使用正向斜杠的能力 当我需要从ASP.NET后端构建警报消息或其他东西,并将其粘贴到前端的JavaScript警报中时,我自己也遇到了这个问题。问题是开发人员可以在Page.Alert()方法中输入任何内容 我解决这个问题的方法如下:
public void Alert(string message)
{
message = message.Replace("\\", "\\\\")
.Replace("\r\n", "\n")
.Replace("\n", "\\n")
.Replace("\t", "\\t")
.Replace("\"", "\\\"");
// and now register my JavaScript with this safe string.
}
我将重复前面说过的内容-javascript中不可能使用逐字字符串。实际上,转义有效的转义字符(如
\n\\\t
等)很容易,但问题在于转义无效字符,因为它们在不同的函数中的处理方式不兼容。比如说
"\a".replace("\a","\\a") // WORKS \a
"aa\a".replace("\a", "\\a") // FAILS \aaa
此外,如果您查看非法特殊字符数组,例如[“\a”]
,则该字符看起来就像a
。这使得做你想做的事情基本上是不可能的
希望这至少能帮你解决这个问题。一个大难题
<html>
<head>
<script>
function foo() {
var string = document.getElementById('foo').innerHTML;
alert(string);
}
window.onload=foo;
</script>
<style>
#foo{
display: none;
}
</style>
</head>
<body>
Calling foo on page load.
<div id="foo">\\server\path\to\file.txt</div>
</body>
</html>
函数foo(){
var string=document.getElementById('foo').innerHTML;
警报(字符串);
}
window.onload=foo;
#福{
显示:无;
}
在页面加载时调用foo。
\\server\path\to\file.txt
模板字符串不支持换行符
`so you can
do this if you want`
当然,它不会阻止文本中的扩展,也不会阻止代码执行,但这可能是一件好事
注意:我认为没有办法获取现有字符串并通过表达式插值运行它。这使得以这种方式注入代码变得不可能,因为代码必须起源于源代码。我不知道有哪种API可以按需进行表达式插值
注2:模板字符串是ES2015/ES6的一项功能。支持除(等待…)IE以外的所有浏览器!但是,Edge不支持模板字符串
注意3:模板字符串扩展转义序列,如果字符串中有字符串,则该字符串将扩展其转义序列
`"A\nB"`
…将导致:
"A
B"
…这将不适用于JSON.parse
,因为字符串文本中现在有一个新行。知道可能很好
这是一个非常古老的线程,但仍然有一个解决方法:
function verbatim(fn){return fn.toString().match(/[^]*\/\*\s*([^]*)\s*\*\/\}$/)[1]}
您将使用它作为:
var myText = verbatim(function(){/*This
is a multiline \a\n\0 verbatim line*/})
基本上,这里发生的是js将注释视为逐字字符串。此外,这些将与函数一起存储。因此,这里发生的事情是,我们创建了一个带有逐字注释的函数,我们在逐字注释函数中提取这些注释。只需使用String.raw()
将输出
\\n
但我不知道如何解决这个案子:
String.raw`hello`hello` // It will throw an TypeError
String.raw`hello\`hello` // Output is 'hello\\`hello'
我不知道如何处理`
:(是的,我们可以使用static。它是在ECMAScript 6(ES6)中引入的。这类似于Python中的r前缀,或者C中的@prefix表示字符串文字
这用于获取模板字符串的原始字符串形式(即原始的、未解释的文本)
语法:
String.raw(callSite, ...substitutions)
or
String.raw`template string`
例如:
const filePath_SimpleString = 'C:\\Development\\profile\\aboutme.html';
const filePath_RawString = String.raw`C:\Development\profile\aboutme.html`;
console.log(`The file was uploaded from: ${filePath}`);
console.log(`The file was uploaded from: ${filePath}`);
// expected output will be same:
//"The file was uploaded from: C:\Development\profile\aboutme.html"
这只是一个例子,非常适合给定的问题(Windows路径)。你可以用任何字符替换/。它实际上并没有回答“如何避免在字符串文本中扩展转义序列”的问题。这有很多副作用,你最好希望字符串中没有-。@胡安·门德斯:“大乱码”的哪一部分你不明白吗?来自维基百科:“一个拙劣的(或拙劣的)解决方案是一个变通办法,一个快速而肮脏的解决方案,一个笨拙或不雅观的解决方案,但有效……”你的解决方案用简单的输入产生错误的结果,甚至不符合拙劣的要求。只是为了支持Muskrat先生……我有一种情况,我保证在我的innerHTML中没有一个-(或其他HTML符号),这是一个有效、快速、肮脏的解决方案,结果非常简单。在我看来,这不符合逐字逐句的示例要求。谢谢,这对我来说很有效。我需要一种快速的方法来获取字符代码进行测试,而且效果很好。它实际上并没有回答问题,这就是“如何避免在字符串文本中扩展转义序列".我不知道为什么会有关于转义字符和替换字符串的讨论,因为这似乎与逐字逐句相反-虽然OP在编程和JS之间进行了比较,但他并没有说他需要它们之间的互操作性。这个答案以一种优雅而令人惊讶的方式工作-这让我的日子有点愉快!但只是复制了JS ga请告诉我错误“无法获取未定义或空引用的属性“1”。将return语句更改为
return fn.toString().split(“/*”)[1]。split(“*/”[0]
仅获取注释之间的所有内容满足了我的需要。非常感谢。String.raw`hello${`}hello`
const filePath_SimpleString = 'C:\\Development\\profile\\aboutme.html';
const filePath_RawString = String.raw`C:\Development\profile\aboutme.html`;
console.log(`The file was uploaded from: ${filePath}`);
console.log(`The file was uploaded from: ${filePath}`);
// expected output will be same:
//"The file was uploaded from: C:\Development\profile\aboutme.html"