JavaScript Переменная внутри строки без конкатенации - например, PHP
Я знаю, что в PHP мы можем сделать что-то вроде этого:
$hello = "foo";
$my_string = "I pity the $hello";
вывод: "Мне жаль foo"
Мне было интересно, возможно ли это в JavaScript. Использование переменных внутри строк без использования конкатенации - это выглядит более кратким и элегантным для записи.
Ответы
Ответ 1
Начиная с Firefox 34/Chrome 41/Safari 9/Microsoft Edge вы можете использовать функцию ES2015/ES6, называемую Template Literals, и использовать этот синтаксис
`String text ${expression}`
Буквы шаблонов заключаются в back-tick (``) (серьезный акцент) вместо двойных или одинарных кавычек.
Пример:
var a = 5;
var b = 10;
console.log(`Fifteen is ${a + b}.`);
// "Fifteen is 15.
Насколько это сообразительно?
Bonus:
Он также позволяет многострочные строки в javascript без экранирования, что отлично подходит для шаблонов:
return `
<div class="${foo}">
...
</div>
`;
Поддержка браузера:
Поскольку этот синтаксис не поддерживается старыми браузерами (Internet Explorer и Safari <= 8), вы можете использовать Babel чтобы преобразовать ваш код в ES5, чтобы он работал везде.
Боковое примечание:
Начиная с IE8 + вы можете использовать базовое форматирование строк внутри console.log
:
console.log('%s is %d.', 'Fifteen', 15);
// Fifteen is 15.
Ответ 2
До Firefox 34/Chrome 41/Safari 9/Microsoft Edge, нет, это невозможно в javascript. Вам придётся прибегать к:
var hello = "foo";
var my_string = "I pity the " + hello;
Ответ 3
До Firefox 34/Chrome 41/Safari 9/Microsoft Edge, no. Хотя вы можете попробовать sprintf для JavaScript, чтобы получить на полпути:
var hello = "foo";
var my_string = sprintf("I pity the %s", hello);
Ответ 4
Хорошо, вы могли бы это сделать, но это не общее
'I pity the $fool'.replace('$fool', 'fool')
Вы можете легко написать функцию, которая делает это разумно, если вам действительно нужно
Ответ 5
Если вам нравится писать CoffeeScript, вы можете сделать:
hello = "foo"
my_string = "I pity the #{hello}"
CoffeeScript на самом деле является javascript, но с гораздо лучшим синтаксисом.
Обзор CoffeeScript проверяет это руководство для начинающих.
Ответ 6
Полный ответ, готовый к использованию:
var Strings = {
create : (function() {
var regexp = /{([^{]+)}/g;
return function(str, o) {
return str.replace(regexp, function(ignore, key){
return (key = o[key]) == null ? '' : key;
});
}
})()
};
Вызов
Strings.create("My firstname is {first}, my last name is {last}", {first:'Neo', last:'Andersson'});
Чтобы прикрепить его к String.prototype:
String.prototype.create = function(o) {
return Strings.create(this, o);
}
Затем используйте как:
"My firstname is ${first}".create({first:'Neo'});
Ответ 7
Если вы пытаетесь сделать интерполяцию для microtemplating, мне нравится Mustache.js для этой цели.
Ответ 8
Вы можете использовать эту функцию javascript для создания такого шаблона. Нет необходимости включать всю библиотеку.
function createStringFromTemplate(template, variables) {
return template.replace(new RegExp("\{([^\{]+)\}", "g"), function(_unused, varName){
return variables[varName];
});
}
createStringFromTemplate(
"I would like to receive email updates from {list_name} {var1} {var2} {var3}.",
{
list_name : "this store",
var1 : "FOO",
var2 : "BAR",
var3 : "BAZ"
}
);
Выход: "I would like to receive email updates from this store FOO BAR BAZ."
Использование функции в качестве аргумента функции String.replace() было частью спецификации ECMAScript v3. Подробнее см. этот SO ответ.
Ответ 9
Я написал этот npm-пакет stringinject https://www.npmjs.com/package/stringinject, который позволяет вам выполнить следующие
var string = stringInject("this is a {0} string for {1}", ["test", "stringInject"]);
который заменит {0} и {1} на элементы массива и вернет следующую строку
"this is a test string for stringInject"
или вы можете заменить заполнители клавишами объектов и такими значениями:
var str = stringInject("My username is {username} on {platform}", { username: "tjcafferkey", platform: "GitHub" });
"My username is tjcafferkey on Github"
Ответ 10
Ну, вы можете использовать this is ${variable}
или можете использовать "this is "+variable
Оба они хорошо работают.
Также не забудьте использовать ключ tilda (``) вокруг this is ${variable}
вместо "или