JavaScript Почему интерполяция строк для одиночных $ и двойных $$ имеет одинаковый результат в функции замены?

#javascript #replace

Вопрос:

Я пытаюсь заменить некоторый код в js с помощью шаблонных литералов и наткнулся на эту аномалию. Может ли кто-нибудь объяснить, почему приведенная ниже замена дает тот же результат. Я протестировал его в Chrome(версия 92.0.4515.107) и FireFox тоже с тем же результатом в консоли. Есть ли что-то большее в шаблонных литералах?

 console.log("word".replace("word", `${"$test"}`));
//outputs : $test

console.log("word".replace("word", `${"$test"}`));
//outputs : $test

console.log(`${"$test"}`) // direct console outputs the right value
//$test 

Комментарии:

1. Теперь я изменил свой код на «word».replace(«word», ${"$$test"} .replaceAll(«$$»,»$$$$$»)); какой вид дает требуемый результат.

Ответ №1:

Это не имеет ничего общего с шаблонными литералами. Вы увидите тот же результат, если будете использовать обычные строки. Это связано с тем, как .replace() метод выполняет свою замену.

$ имеет особое значение в строке замены. Наиболее распространенным использованием является интерполяция группы захвата при замене регулярным выражением, но специальная обработка выполняется даже при замене фиксированной строки.

$$ это способ избежать $ того , чтобы он вставлял a $ , поэтому $$test вставляет $test замену.

$test делает то же самое, потому $t что не имеет особого значения, поэтому это трактуется буквально.

Комментарии:

1. Теперь я понимаю. Не знал, что к $ относятся по-другому. Алсмост потратил час, пытаясь выяснить, не отправлял ли мой код неправильные значения в цикле. Спасибо

Ответ №2:

$ имеет особое значение в строке замены. Строка замены использует $n для ссылки на n-ю захваченную группу и $$ является конкретным способом создания одного символа доллара.

Видишь https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_a_parameter

Ответ №3:

Это строка замены (по дизайну). См. MDN. Шаблон (специальная замена) $$ заменяется на $

Комментарии:

1. Так что это делает функция замены. Спасибо.

Ответ №4:

Для всех, кто столкнется с этой проблемой в будущем, ниже приведено возможное решение. Используется функция замены и регулярное выражение, чтобы избежать замены соответствия шаблону. Хотя какой-нибудь спасательный персонаж справился бы с этой задачей лучше.

 var result = "word".replace("word",
          `${"$test$$"}`
            .replaceAll(/(?<=$)[$] /g, x => "$".repeat(x.length * 2)));
console.log(result);

//example
console.log("<span id='tabid' [tabpage=$navliID]></span>".replace("[tabpage=$navliID]", `tabpage='${"$navli$$"}'`.replaceAll(/(?<=$)[$] /g, x => "$".repeat(x.length * 2))));