Как избежать вложенных одинарных кавычек внутри обратного тика или обратной кавычки - PullRequest
1 голос
/ 29 мая 2020

Допустим, у нас есть следующий шаблонный литерал в ES16.

`'{"0": "It's Friday today"}'`

Как избежать одинарной кавычки в слове Это

Кроме того, допустим у нас есть следующий литерал шаблона:

`'{"0": "Thursday\nFriday"}'`

Как нам избежать \n в приведенном выше примере.

Ответы [ 4 ]

1 голос
/ 29 мая 2020

Вам не нужно экранировать любой из них, если вы не хотите использовать содержимое литерала шаблона как строковый литерал, заключенный в одинарную кавычку в какой-то момент. Что выглядит действительно подозрительно: никогда не создавайте вручную JSON строк (и если вы это сделаете, не делайте этого, заключенного в строковый литерал в шаблонном литерале! :-)). Но если вы хотите определить этот строковый литерал в литерале шаблона, вот как выполнить экранирование на уровне строкового литерала:

Чтобы избежать ' в It's в строке литерал, который будет определять шаблон, вам нужно поставить перед ним backsla sh. Но поскольку обратная косая черта является экранированием в шаблонных литералах, вам нужно избегать обратной косой черты sh, чтобы она не использовалась литералом шаблона, а позже использовалась при оценке строкового литерала. Итак:

// Define the template literal:
const s1 = `'{"0": "It\\'s Friday today"}'`;
// Escaped backslash −^^
console.log(s1);

// Evaluate the single-quoted string literal it defined:
const s2 = eval("(" + s1 + ")");
console.log(s2);

// Since that defined a string containing JSON, let's parse it:
const obj = JSON.parse(s2);
console.log(obj[0]);

Во втором примере с \n escape-последовательность \n используется на уровне литерала шаблона, что означает, что литерал шаблона содержит новую строку. Но вы хотите, чтобы это не была новая строка с точки зрения литерала шаблона, поэтому вы ... избегаете его: \\n. Теперь это уже не новая строка для литерала шаблона, а для строкового литерала в одинарных кавычках. Теперь это то же самое, что и It's выше: если вы не хотите, чтобы строковый литерал в одинарных кавычках использовал последовательность \n esape, вам нужно его экранировать. Это означает, что вы получите \\\\n:

// Define the template literal:
// 1st escaped backslash −−−vv
const s1 = `'{"0": "Thursday\\\\nFriday"}'`;
// 2nd escaped backslash −−−−−^^
console.log(s1);

// Evaluate the single-quoted string literal it defined:
const s2 = eval("(" + s1 + ")");
console.log(s2);

// Since that defined a string containing JSON, let's parse it:
const obj = JSON.parse(s2);
console.log(obj[0]);
0 голосов
/ 30 мая 2020

По умолчанию вам не нужно их экранировать.

Если вы хотите проанализировать его позже, вы можете использовать функцию тега шаблона.

Функции тега шаблона получают неэкранированную строку для дальнейшей обработки.

Функция тега String.raw, например, возвращает строку без синтаксического анализа дополнительных escape-символов:

console.log(String.raw `'{"0": "It\'s Friday today"}'`)
//       A single \ will do it ---^-----v
console.log(String.raw `'{"0": "Thursday\nFriday"}'`)
0 голосов
/ 29 мая 2020

Я думаю, что использование обратных тиков неверно. Вы можете написать это следующим образом:

'\'{"0": "It\'s Friday today"}\''

'\'{"0": "Thursday\nFriday"}\''

В любом случае, я думаю, что вся цель этого слишком сложна, если вы просто хотите создать json , просто создайте объект и затем преобразуйте его в json:

var obj1 = {0: "It's Friday today"};
var obj2 = {0: "Thursday\nFriday"};

var json1 =  JSON.stringify(obj1);
var json2 =  JSON.stringify(obj2);

var final1 = "'" + json1 + "'";
var final2 = "'" + json2 + "'";

Таким образом проще и с меньшей вероятностью будут возникать синтаксические ошибки.

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

0 голосов
/ 29 мая 2020

1: используйте \ '{"0": "It\'s Friday today"}' 2: снова используйте \ '{"0": "Thursday\\nFriday"}'

...