¿Cómo puedo usar barras diagonales inversas (\) en una cadena?

Intenté muchas maneras de obtener una barra invertida desde una ejecutada (no me refiero a una entrada de html ).

Puedo obtener caracteres especiales como tab, nueva línea y muchas otras, y luego escapar a \\t o \\n o \\(someother character) pero no puedo obtener una sola barra invertida cuando hay un carácter no especial al lado.

No quiero algo como:

 str = "\apple"; // I want this, to return: console.log(str); // \apple 

y si trato de obtener el carácter en 0 entonces obtengo a lugar de \ .

    (Consulte la actualización de ES2015 al final de la respuesta).

    Has etiquetado tu pregunta tanto de string como de regex .

    En JavaScript, la barra diagonal inversa tiene un significado especial tanto en cadenas literales como en expresiones regulares. Si desea una barra invertida real en la cadena o en la expresión regular, debe escribir dos: \\ .

    Esta cadena comienza con una barra invertida, la primera que ve en el literal es un personaje de escape que nos dice que tomemos el siguiente carácter literalmente:

     var str = "\\I have one backslash"; 

    Esta expresión regular coincidirá con una sola barra invertida (no dos); de nuevo, el primero que ves en el literal es un personaje de escape que nos dice que tomemos el siguiente carácter literalmente:

     var rex = /\\/; 

    Si está utilizando una cadena para crear una expresión regular (en lugar de utilizar un literal de expresión regular como lo hice anteriormente), tenga en cuenta que se trata de dos niveles: el nivel de cadena y el nivel de expresión regular. Entonces, para crear una expresión regular usando una cadena que coincida con una sola barra invertida, terminas usando cuatro :

     // Matches *one* backslash var rex = new RegExp("\\\\"); 

    Eso es porque primero, estás escribiendo una cadena literal, pero quieres poner barras invertidas en ella. Entonces haces eso con \\ por cada barra invertida que quieras. Pero tu expresión regular también requiere dos \\ por cada barra invertida real que desees, por lo que debe ver dos barras diagonales inversas en la cadena. Por lo tanto, un total de cuatro. Esta es una de las razones por las que evito usar el new RegExp(string) siempre que puedo; Me confundo fácilmente. 🙂

    Actualización ES2015

    Avance rápido hasta 2015, y como señala Dolphin_Wood, el nuevo estándar ES2015 nos da literales de plantilla, funciones de etiqueta y la función String.raw :

     // Yes, this unlikely-looking syntax is actually valid ES2015 let str = String.raw`\apple`; 

    str termina teniendo los caracteres \ , a , p , p , l y e en él. Solo tenga cuidado de que no haya ${ en su “cadena” (plantilla), ya que esta es una plantilla literal y ${ inicia una sustitución. P.ej:

     let foo = "bar"; let str = String.raw`\apple${foo}`; 

    … termina siendo \applebar . También tenga en cuenta que esto no es exactamente como cadenas “literales” en C # o similar, ya que las secuencias que coinciden con LegacyOctalEscapeSequence en la especificación no están permitidas y causan un error de syntax. Entonces por ejemplo

     // Fails let str = String.raw`c:\foo\12\bar`; 

    … falla porque \12 parece un legado octal literal.

    \ es un carácter de escape, cuando va seguido de un carácter no especial, no se convierte en un literal \ . En cambio, debes \\ .

     console.log("\apple"); //-> "apple" console.log("\\apple"); //-> "\apple" 

    No hay forma de obtener la definición original de cadena sin formato o crear una cadena literal sin caracteres de escape.

    Prueba el método String.raw :

     str = String.raw`\apple` // "\apple" 

    Referencia aquí: String.raw ()

    str = "\apple" escapa del primero a , entonces te queda a como primer personaje. No hay forma (afaik) de hacer que "\apple" mantenga “\” sin escapar de él. Sin embargo, puedes automatizar el escape así:

     String.prototype.esc = function(){ return '\\'+this; } //and use it as var str = 'a'.esc()+'pple'; //or var str = 'apple'.esc(); //tests str[0]; //=> '\' str.match(/\\/); //=> ['\'] RegExp('\\\\').test(str); //=> true str.substr(0,1); // '\'