#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-ю захваченную группу и $$
является конкретным способом создания одного символа доллара.
Ответ №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))));