JavaScript支持逐字字符串吗?

JavaScript支持逐字字符串吗?,javascript,string,Javascript,String,在C#中,可以使用如下逐字字符串: @"\\server\share\file.txt" JavaScript中有类似的东西吗?不,JavaScript中不支持。这种解决方法似乎很有问题,因为您现在失去了使用正向斜杠的能力 当我需要从ASP.NET后端构建警报消息或其他东西,并将其粘贴到前端的JavaScript警报中时,我自己也遇到了这个问题。问题是开发人员可以在Page.Alert()方法中输入任何内容 我解决这个问题的方法如下: public void Alert(string mess

在C#中,可以使用如下逐字字符串:

@"\\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"