Интерпретировать строку как экранированную строку - PullRequest
0 голосов
/ 18 декабря 2018

Почему это не работает?

decodeURI('\n') => newline;
decodeURI("\\n") => '\n', thus presumably...
decodeURI(decodeURI("\\n")) // => gives '\n' instead of newline

Но это работает?

JSON.parse('"\\n"') // => newline

Суть в том, чтобы иметь возможность построить символьную строку \ *, а затем преобразовать ее вего фактический характер - через decodeURI.

Я хотел бы по возможности избегать использования JSON.parse.

EDIT

Я понимаю, что мой подход сбивал с толку.Лучше было бы спросить, как decodeURI и JSON.parse выполняют преобразование строкового литерала в разрешенный символ и было ли что-то более прямое.

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Существует причина, по которой это:

decodeURI(decodeURI("\\n"));

Не дает новую строку, но это делает:

JSON.parse('"\\n"');

Это потому, что \n на самом деле не является компонентом URI(если бы символ новой строки был закодирован URI, он выглядел бы как %0A, а не \n), а также потому, что он на самом деле экранирован.

Вот некоторые демонстрации:


Демонстрация 1: decodeURI("\n"):

var newline = decodeURI("\n");
console.log("Line One" + newline + "Line Two");

Как видно из вышеприведенного, в консоли есть новая строка между Line One и Line Two.


Демонстрация 2: decodeURI(decodeURI("\\n")):

var newline = decodeURI(decodeURI("\\n"));
console.log("Line One" + newline + "Line Two");

Здесь мы видим, что экранированный символ новой строки (\\n) при декодировании представляет собой просто строку новой строки - newline буквально - строка"\n", не перевод строки.Мы можем убедиться в этом в следующей демонстрации:


Демонстрация 3: typeof decodeURI("\\n"):

var newline = decodeURI("\\n");
console.log("Line One" + newline + "Line Two");
console.log(typeof newline);

И здесь мы видим, что decodeURI("\\n") возвращает просто строку \n, которая по неизвестным причинам не может быть декодирована с помощью decodeURI дважды, как вы увидитездесь:


Демонстрация 4: decodeURI(decodeURI("\\n")):

var newline = decodeURI("\\n");
var temp = decodeURI(newline);
console.log("Line One" + newline + "Line Two");
newline = temp;
console.log("Line One" + newline + "Line Two");

И здесь мы видим, что newline и temp - это почти одно и то же - строка "\n".


Существует причина, по которой этот код:

decodeURI("\n");

Фактически возвращает также символ новой строки - это потому, что перед использованием decodeURI, "\n" уже является символом новой строки, поэтому decodeURI является избыточным,Смотрите это:

var newlineString = "\n";
var newline = decodeURI(newlineString);
console.log("Line One" + newlineString + "Line Two");
console.log("Line One" + newline + "Line Two");

Здесь обе строки разделены переносами строк, что означает, что "\n" на самом деле вообще не декодируется - вам не нужно decodeURI для этоговообще.


Надеюсь, это поможет вам!


Дополнительная информация:

0 голосов
/ 18 декабря 2018
decodeURI('\n') => newline; thus presumably

В вашем коде \n - это символ новой строки еще до того, как он перейдет к decodeURI .Обратная косая черта имеет значение в строковом литерале в JavaScript.

decodeURI(decodeURI("\\n")) // => gives '\n' instead of newline

В этом примере вы избежали обратной косой черты с помощью другой обратной косой черты.Поэтому вместо передачи символа новой строки в decodeURI() вы передаете текст символа обратной косой черты и символа 'n'.Ни один из них не имеет специального значения в URI, и, следовательно, выходные данные этого decodeURI() совпадают с его входными данными.Делая это дважды, конечно, не имеет значения.Я не очень понимаю, что вы здесь думаете.

Но это так?

JSON.parse('"\\n"') // => newline

Опять попробуйте распаковать эточто ты здесь делаешьПервая обратная косая черта избегает следующей, оставляя вас с реальной обратной косой чертой в строке.Итак, настоящая строка - "\n".Если вы JSON.parse() это, парсер сначала интерпретирует, что вы имеете дело со строковым литералом.Затем он декодирует \n до символа новой строки.Вот почему он выводит только новую строку.

Суть в том, чтобы иметь возможность построить * символьную строку, а затем преобразовать ее в ее действительный символ с помощью decodeURI.

decodeURI не имеет к этому никакого отношения.

...