array - slice javascript
¿Admite JavaScript cadenas verbatim? (6)
En C # puedes usar cadenas verbatim como esta:
@"//server/share/file.txt"
¿Hay algo similar en JavaScript?
Gran kludge de una solución ...
<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>
No, no hay soporte para eso en JavaScript. Y esa solución parece muy problemática ya que ahora pierde la capacidad de tener barras diagonales.
Me he encontrado con este problema cuando necesitaba crear un mensaje de alerta o algo de un back-end de ASP.NET, y pegarlo en una alerta de JavaScript en el front-end. El problema era que los desarrolladores podían ingresar cualquier cosa en el método Page.Alert ().
Lo que hice para resolver esto fue el siguiente:
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.
}
Volveré a repetir lo que se ha dicho antes: las cadenas verbatim no son posibles en JavaScript. En realidad, es fácil escapar de los caracteres de escape válidos, como /n // /t
etc. pero el problema proviene del hecho de que se escapen caracteres no válidos debido a la forma en que se manejan en las diferentes funciones que se vuelven incompatibles. Por ejemplo
"/a".replace("/a","//a") // WORKS /a
"aa/a".replace("/a", "//a") // FAILS /aaa
Además, si observa una serie de caracteres especiales ilegales, por ejemplo ["/a"]
el personaje se verá como un a
. Esto hace que hacer lo que quieres sea esencialmente imposible.
Espero que al menos lo aclare.
Las cadenas de plantillas soportan saltos de línea.
`so you can
do this if you want`
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals
Por supuesto, no impide que ocurra una expansión en el texto y, por extensión, en la ejecución del código, pero tal vez eso sea algo bueno.
Nota: no creo que haya una manera de tomar una cadena existente y ejecutarla a través de la interpolación de expresiones. Esto hace que sea imposible inyectar código de esta manera ya que el código tiene que originarse en la fuente. No sé de una API que pueda hacer interpolación de expresiones a pedido.
Nota 2: las cadenas de plantillas son una característica ES2015 / ES6. Soporte en todos los navegadores excepto (espere ...) ¡IE! Sin embargo, Edge admite cadenas de plantillas.
Nota 3: Las cadenas de plantillas expanden las secuencias de escape, si tiene una cadena dentro de una cadena, esa cadena expandirá sus secuencias de escape.
`"A/nB"`
...resultará en:
"A B"
... que no funcionará con
JSON.parse
porque ahora hay una nueva línea en el literal de la cadena. Sería bueno saberlo.
Este es un hilo muy antiguo, pero aún hay una solución:
function verbatim(fn){return fn.toString().match(/[^]*///*/s*([^]*)/s*/*///}$/)[1]}
Que usarás como esto:
var myText = verbatim(function(){/*This
is a multiline /a/n/0 verbatim line*/})
Básicamente, lo que sucede aquí es que js trata los comentarios de hecho como cadenas verbatim. Además, estos se almacenan junto con la función. Entonces, lo que sucede aquí es que creamos una función con algunos comentarios verbatim que extraemos en la función textual.
Solo use String.raw()
String.raw`/n`
saldrá
//n
Pero no sé cómo resolver el caso:
String.raw`hello`hello` // It will throw an TypeError
String.raw`hello/`hello` // Output is ''hello//`hello''
No sé cómo lidiar con `
:(