Bagaimana cara menempatkan variabel di dalam string javascript?

155
s = 'hello %s, how are you doing' % (my_name)

Begitulah cara Anda melakukannya dengan python. Bagaimana Anda bisa melakukannya di javascript / node.js?

TIMEX
sumber
1
Saya yakin ada orang lain yang akan melakukannyavar s = 'hello ${my_name}, how are you doing';
Raynos
1
Saya menggunakan seperti yang dikatakan Raynos: puisi const = "Sungai hitam"; const author = "Joseph Troll"; const favePoem = `Puisi favorit saya adalah $ {poem} oleh $ {author} \.`; Atau Anda dapat menggunakan: console.log ('% s adalah% d.', 'Eleven', 11);
Gilberto B. Terra Jr.
Template normal tersedia selama bertahun-tahun sekarang TAPI ANDA HARUS MENGGUNAKAN LATAR BELAKANG stackoverflow.com/a/37245773/294884 stackoverflow.com/a/37245773/294884 stackoverflow.com/a/37245773/294884 stackoverflow.com/a/37245773/294884
Fattie

Jawaban:

58

Perhatikan, mulai 2015 dan seterusnya, cukup gunakan backticks untuk membuat template

https://stackoverflow.com/a/37245773/294884

let a = `hello ${name}`    // NOTE!!!!!!!! ` not ' or "

Perhatikan bahwa ini adalah backtick , bukan kutipan.


Jika Anda ingin memiliki sesuatu yang serupa, Anda dapat membuat sebuah fungsi:

function parse(str) {
    var args = [].slice.call(arguments, 1),
        i = 0;

    return str.replace(/%s/g, () => args[i++]);
}

Pemakaian:

s = parse('hello %s, how are you doing', my_name);

Ini hanyalah contoh sederhana dan tidak memperhitungkan berbagai jenis tipe data (seperti %i, dll) atau pelolosan %s. Tapi saya harap ini memberi Anda beberapa ide. Saya cukup yakin ada juga perpustakaan di luar sana yang menyediakan fungsi seperti ini.

Felix Kling
sumber
1
Itu pada dasarnya yang terbaik yang akan Anda dapatkan karena tidak didukung secara langsung oleh bahasa seperti di python.
Jim Schubert
Jawaban lain, yaitu fitur util.format (), harus menjadi jawaban yang diterima ... meskipun sebaiknya juga menyebutkan string template ES6 (yang memang tidak ada pada tahun 2011). Kami benar-benar harus dapat membajak wiki pertanyaan lama agar tetap diperbarui. : \
Kyle Baker
1
@FelixKling, karena Anda adalah jawaban yang diterima, dapatkah Anda memperbarui jawaban Anda sendiri untuk menunjukkan penggunaan lain yang benar?
Kyle Baker
1
Ini bagus, template literal tidak persis sama
Capuchin
Saya mengalami masalah saat menggunakan "argumen". Ketika beberapa klien lulus dari parse, "str" ​​tercampur. Ada penjelasan?
tspentzas
419

Dengan Node.js v4, Anda dapat menggunakan string Template ES6

var my_name = 'John';
var s = `hello ${my_name}, how are you doing`;
console.log(s); // prints hello John, how are you doing

Anda perlu membungkus string dengan backtick, ` bukan'

Sridhar
sumber
1
Plus 1 Karena kami berada di tahun 2017 dan ES6 pada dasarnya standar di dunia node.
Jankapunkt
1
Ini sekarang (2017) jawaban yang benar. Ketahuilah bahwa Anda akan membutuhkan Babel di toolchain Anda untuk mendukung browser lama.
superluminary
3
Saya telah menyarankan kepada pengembang node.js bahwa akan sangat berguna untuk memperjelas pada halaman seperti nodejs.org/api/readline.html bahwa ini adalah backtick. Ada masalah untuk itu di sini: github.com/nodejs/docs/issues/55
Gail Foad
Jatuh karena jebakan backticks sendiri, terima kasih atas komentarnya;)
Overdrivr
3
Bagaimana jika string saya adalah bagian dari file konfigurasi hello ${my_name}, how are you doingdan saya ingin menetapkan variabel secara dinamis setelah membaca string dari config?
Amreesh Tyagi
43

Sejak node.js >4.0itu menjadi lebih kompatibel dengan standar ES6, di mana manipulasi string meningkat pesat.

The jawaban untuk pertanyaan asli dapat sesederhana:

var s = `hello ${my_name}, how are you doing`;
// note: tilt ` instead of single quote '

Di mana string bisa menyebarkan banyak baris, itu membuat template atau proses HTML / XML cukup mudah. Lebih detil dan kemampuan lebih tentang itu: Literal template adalah literal string di mozilla.org.

Andrew_1510
sumber
3
"tilt` bukannya single quote '"Anda simpan may day :)
Mario Binder
40

util.format melakukan ini.

Ini akan menjadi bagian dari v0.5.3 dan dapat digunakan seperti ini:

var uri = util.format('http%s://%s%s', 
      (useSSL?'s':''), apiBase, path||'/');
Jim Schubert
sumber
3
Bagus, terima kasih atas tipnya! console.log ('% s', value) juga harus berfungsi.
Azat
16

Lakukan itu:

s = 'hello ' + my_name + ', how are you doing'

Memperbarui

Dengan ES6, Anda juga bisa melakukan ini:

s = `hello ${my_name}, how are you doing`
KodeFor.Me
sumber
Apa maksudmu "Ini tidak mungkin"? :? Jika Anda ingin memiliki teks berformat Anda dapat melakukannya seperti yang dijelaskan di atas oleh Felix Kling. Ini adalah jawaban terbaik seperti yang saya lihat di sini;) :)
KodeFor.Me
@TIMEX Mungkin saja mencobanya.
dev_khan
5

Beberapa cara untuk memperluas String.prototype, atau menggunakan literal template ES2015 .

var result = document.querySelector('#result');
// -----------------------------------------------------------------------------------
// Classic
String.prototype.format = String.prototype.format ||
  function () {
    var args = Array.prototype.slice.call(arguments);
    var replacer = function (a){return args[a.substr(1)-1];};
    return this.replace(/(\$\d+)/gm, replacer)
};
result.textContent = 
  'hello $1, $2'.format('[world]', '[how are you?]');

// ES2015#1
'use strict'
String.prototype.format2 = String.prototype.format2 ||
  function(...merge) { return this.replace(/\$\d+/g, r => merge[r.slice(1)-1]); };
result.textContent += '\nHi there $1, $2'.format2('[sir]', '[I\'m fine, thnx]');

// ES2015#2: template literal
var merge = ['[good]', '[know]'];
result.textContent += `\nOk, ${merge[0]} to ${merge[1]}`;
<pre id="result"></pre>

KooiInc
sumber
4

Saya menulis fungsi yang memecahkan masalah dengan tepat.

Argumen pertama adalah string yang ingin dijadikan parameter. Anda harus meletakkan variabel Anda dalam string ini seperti format ini "% s1,% s2, ...% s12" .

Argumen lain adalah parameter masing-masing untuk string itu.

/***
 * @example parameterizedString("my name is %s1 and surname is %s2", "John", "Doe");
 * @return "my name is John and surname is Doe"
 *
 * @firstArgument {String} like "my name is %s1 and surname is %s2"
 * @otherArguments {String | Number}
 * @returns {String}
 */
const parameterizedString = (...args) => {
  const str = args[0];
  const params = args.filter((arg, index) => index !== 0);
  if (!str) return "";
  return str.replace(/%s[0-9]+/g, matchedStr => {
    const variableIndex = matchedStr.replace("%s", "") - 1;
    return params[variableIndex];
  });
}

Contoh

parameterizedString("my name is %s1 and surname is %s2", "John", "Doe");
// returns "my name is John and surname is Doe"

parameterizedString("this%s1 %s2 %s3", " method", "sooo", "goood");
// returns "this method sooo goood"

Jika posisi variabel berubah dalam string itu, fungsi ini mendukungnya juga tanpa mengubah parameter fungsi.

parameterizedString("i have %s2 %s1 and %s4 %s3.", "books", 5, "pencils", "6");
// returns "i have 5 books and 6 pencils."
fatihturgut.dll
sumber
3

Jika Anda menggunakan node.js, console.log () menggunakan string format sebagai parameter pertama:

 console.log('count: %d', count);
Andrey Sidorov
sumber
Ini adalah poin yang bagus, tetapi pertanyaannya adalah tentang interpolasi string. console.log()hanya mengeluarkan string yang diformat ke STDOUT. Dengan kata lain, Anda tidak dapat menggunakan hasil daricount: %d
Jim Schubert
3

const format = (...args) => args.shift().replace(/%([jsd])/g, x => x === '%j' ? JSON.stringify(args.shift()) : args.shift())

const name = 'Csaba'
const formatted = format('Hi %s, today is %s and your data is %j', name, Date(), {data: {country: 'Hungary', city: 'Budapest'}})

console.log(formatted)

cstuncsik.dll
sumber
2
var user = "your name";
var s = 'hello ' + user + ', how are you doing';
Termi
sumber
Saya melihat beberapa masalah dengan itu; itu menggunakan penggabungan daripada pemformatan string yang merupakan bendera merah bagi saya ketika melakukan tinjauan kode, karena biasanya lebih sulit untuk dibaca dan dipelihara. Anda juga tidak dapat dengan aman menyimpan "pola" itu dalam sistem pengambilan (seperti file konfigurasi atau DB) dan memasukkan nilai pengguna nanti.
Rory Browne
1

Berikut adalah contoh Literal String Multi-baris di Node.js.

> let name = 'Fred'
> tm = `Dear ${name},
... This is to inform you, ${name}, that you are
... IN VIOLATION of Penal Code 64.302-4.
... Surrender yourself IMMEDIATELY!
... THIS MEANS YOU, ${name}!!!
...
... `
'Dear Fred,\nThis is to inform you, Fred, that you are\nIN VIOLATION of Penal Code 64.302-4.\nSurrender yourself IMMEDIATELY!\nTHIS MEANS YOU, Fred!!!\n\n'
console.log(tm)
Dear Fred,
This is to inform you, Fred, that you are
IN VIOLATION of Penal Code 64.302-4.
Surrender yourself IMMEDIATELY!
THIS MEANS YOU, Fred!!!


undefined
>
Cinta dan perdamaian - Joe Codeswell
sumber
Ini disebut template string , dan Anda mungkin hanya ingin memberi suara positif pada jawaban yang sudah ada ini
Bergi
Contoh "template string" yang telah saya tunjukkan ADALAH "template string" yang menggunakan Literal String Multi-baris.
Cinta dan perdamaian - Joe Codeswell