Как интерполировать переменные в строках в JavaScript, без конкатенации? - PullRequest
298 голосов
/ 22 июля 2010

Я знаю, что в PHP мы можем сделать что-то вроде этого:

$hello = "foo";
$my_string = "I pity the $hello";

Вывод: "I pity the foo"

Мне было интересно, возможно ли то же самое в JavaScript.Использование переменных внутри строк без конкатенации - это выглядит более лаконично и элегантно для написания.

Ответы [ 11 ]

518 голосов
/ 22 января 2015

Начиная с Firefox 34 / Chrome 41 / Safari 9 / Microsoft Edge вы можете использовать функцию ES2015 / ES6 под названием Шаблонные литералы и использовать этот синтаксис:

`String text ${expression}`

Шаблонные литералы заключены в обратный тик (``) (серьезный акцент) вместо двойных или одинарных кавычек.

Пример:

var a = 5;
var b = 10;
console.log(`Fifteen is ${a + b}.`);
// "Fifteen is 15.

Насколько это удобно?

Бонус:

Он также позволяет создавать многострочные строки в javascript без экранирования, что отлично подходит для шаблонов:

return `
    <div class="${foo}">
         ...
    </div>
`;

Поддержка браузера :

Поскольку этот синтаксис не поддерживается старыми браузерами (Internet Explorer и Safari <= 8), вы можете использовать <a href="https://babeljs.io/" rel="noreferrer"> Babel для переноса вашего кода в ES5, чтобы он работал везде.


Примечание:

Начиная с IE8 +, вы можете использовать базовую строкуформатирование внутри console.log:

console.log('%s is %d.', 'Fifteen', 15);
// Fifteen is 15.
161 голосов
/ 22 июля 2010

До Firefox 34 / Chrome 41 / Safari 9 / Microsoft Edge, нет, это было невозможно в javascript.Вам придется прибегнуть к:

var hello = "foo";
var my_string = "I pity the " + hello;
40 голосов
/ 22 июля 2010

До Firefox 34 / Chrome 41 / Safari 9 / Microsoft Edge, № Хотя вы можете попробовать sprintf для JavaScript , чтобы добраться до середины пути:

var hello = "foo";
var my_string = sprintf("I pity the %s", hello);
27 голосов
/ 22 июля 2010

хорошо, вы могли бы сделать это, но это не вообще

'I pity the $fool'.replace('$fool', 'fool')

Вы можете легко написать функцию, которая делает это разумно, если вам действительно нужно

9 голосов
/ 05 июля 2017

Полный ответ, готов к использованию:

 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'});
9 голосов
/ 08 февраля 2017

Вы можете использовать эту функцию 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 голосов
/ 13 февраля 2015

Если вы хотите написать CoffeeScript, вы можете сделать:

hello = "foo"
my_string = "I pity the #{hello}"

CoffeeScript на самом деле является javascript, но с гораздо лучшим синтаксисом.

Для обзора CoffeeScript отметьте это Руководство для начинающих .

4 голосов
/ 22 июля 2010

Если вы пытаетесь выполнить интерполяцию для микротемблирования, мне нравится Mustache.js для этой цели.

3 голосов
/ 08 июля 2017

Я написал этот 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" 
2 голосов
/ 14 мая 2018

Не вижу никаких внешних библиотек, упомянутых здесь, но Lodash имеет _.template(),

https://lodash.com/docs/4.17.10#template

Если вы уже используете библиотеку, стоит проверить, а если вы не пользуетесь Lodash, вы всегда можете выбрать методы выбора вишни из npm npm install lodash.template, чтобы сократить накладные расходы.

Простейшая форма -

var compiled = _.template('hello <%= user %>!');
compiled({ 'user': 'fred' });
// => 'hello fred!'

Существует также множество параметров конфигурации -

_.templateSettings.interpolate = /{{([\s\S]+?)}}/g;
var compiled = _.template('hello {{ user }}!');
compiled({ 'user': 'mustache' });
// => 'hello mustache!'

Мне показались наиболее интересными пользовательские разделители.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...