Saya tidak yakin bagaimana menjelaskan ini, tetapi ketika saya lari
console.log`1`
Di google chrome, saya mendapatkan keluaran seperti
console.log`1`
VM12380:2 ["1", raw: Array[1]]
Mengapa backtick memanggil fungsi log, dan mengapa itu membuat indeks raw: Array[1]
?
Pertanyaan yang diajukan di ruang JS oleh Catgocat, tetapi tidak ada jawaban yang masuk akal selain sesuatu tentang string template yang tidak benar-benar sesuai dengan mengapa hal ini terjadi.
javascript
ecmascript-6
template-strings
template-literals
tagged-templates
Sterling Archer
sumber
sumber
Jawaban:
Ini disebut Template Tagged di ES-6 lebih banyak yang bisa dibaca tentang mereka Di sini , lucu saya menemukan tautan di bagian berbintang di obrolan.
Tetapi bagian yang relevan dari kode ada di bawah (pada dasarnya Anda dapat membuat semacam yang difilter).
function tag(strings, ...values) { assert(strings[0] === 'a'); assert(strings[1] === 'b'); assert(values[0] === 42); return 'whatever'; } tag `a${ 42 }b` // "whatever"
Pada dasarnya, ini hanya menandai "1" dengan fungsi console.log, seperti yang akan dilakukan dengan fungsi lainnya. Fungsi penandaan menerima nilai parsing dari string template dan nilai secara terpisah di mana tugas selanjutnya dapat dilakukan.
Babel memindahkan kode di atas ke
var _taggedTemplateLiteralLoose = function (strings, raw) { strings.raw = raw; return strings; }; console.log(_taggedTemplateLiteralLoose(["1"], ["1"]));
Seperti yang Anda lihat pada contoh di atas, setelah ditranspilasi oleh babel, fungsi penandaan (console.log) sedang diberikan nilai kembalian dari kode transpiled es6-> 5 berikut.
_taggedTemplateLiteralLoose( ["1"], ["1"] );
Nilai yang dikembalikan dari fungsi ini diteruskan ke console.log yang kemudian akan mencetak array.
sumber
Literal template yang diberi tag:
Sintaks berikut:
function`your template ${foo}`;
Disebut literal template yang diberi tag.
Fungsi yang disebut sebagai template literal yang diberi tag menerima argumennya dengan cara berikut:
function taggedTemplate(strings, arg1, arg2, arg3, arg4) { console.log(strings); console.log(arg1, arg2, arg3, arg4); } taggedTemplate`a${1}b${2}c${3}`;
arg4
(karena hanya ada 3 kali interpolasi string) dan dengan demikianundefined
dicatat ketika kita mencoba untuk masukarg4
Menggunakan sintaks parameter rest:
Jika kita tidak tahu sebelumnya berapa kali interpolasi string akan berlangsung di string template, sering kali berguna untuk menggunakan sintaks parameter lainnya. Sintaks ini menyimpan argumen tersisa yang diterima fungsi ke dalam array. Sebagai contoh:
function taggedTemplate(strings, ...rest) { console.log(rest); } taggedTemplate `a${1}b${2}c${3}`; taggedTemplate `a${1}b${2}c${3}d${4}`;
sumber