Mengapa interpolasi string CoffeeScript mengawali ekspresi dengan string kosong?

Di CoffeeScript, pernyataan berikut dievaluasi menjadi pernyataan JavaScript yang diawali dengan string kosong.

Saya merasa ada batasan dalam hal keamanan tipe, tetapi saya tidak dapat memikirkannya begitu saja. Dalam hal apa awalan membuat perbedaan?

Skrip Kopi:

x = "#{foo} bar"

JavaScript:

x = "" + foo + " bar";

person Kaushik Shankar    schedule 04.11.2014    source sumber
comment
Saya tidak 100% yakin, tetapi perlu diperhatikan sedikit kode yang saya coba ini: {a:'y'}+" thing" =› NaN tetapi ""+{a:'y'}+" thing" =› [objek Objek] . Jadi tebakan saya adalah menggabungkan objek ke string kosong memanggil toString pada objek sebelum penggabungan   -  person Brennan    schedule 04.11.2014
comment
Hal ini berkaitan dengan langkah 7 dan 8 dari definisi operator + dan memastikan penggabungan (7) vs. penambahan (8). Contoh yang dibuat-buat adalah "#{3}#{4}". Dengan string kosong di awal ekspresi ("" + 3 + 4), hasilnya adalah "34". Tanpanya (3 + 4), hasilnya 7.   -  person Jonathan Lonowski    schedule 04.11.2014
comment
@Brennan: Tidak. Anda menjadi mangsa {a:'y';} menjadi sintaks blok (lihat ini pertanyaan). Coba ({a:'y'})+" thing"   -  person Bergi    schedule 04.11.2014
comment
@JonathanLonowski, penjelasan sempurna, terima kasih. Juga, Bergi, terima kasih, senang mengetahuinya   -  person Brennan    schedule 04.11.2014
comment
Terima kasih @JonathanLonowski atas tautan ke definisi operator! Saya akhirnya mengerti apa yang terjadi di sini! Tangkapannya di sini adalah dengan {} + " bar" yang sebenarnya terjadi adalah ia masuk ke opsi ke-8 (mengonversi ke angka) yang pada gilirannya mencoba memaksa ToPrimitive objek sebagai angka, yang pada gilirannya adalah NaN!   -  person Kaushik Shankar    schedule 04.11.2014
comment
@KaushikShankar Menggunakan {} menambahkan beberapa kompleksitas tambahan karena memiliki 2 kegunaan dalam JavaScript. Jika ditulis sendiri, {} + " bar" sebenarnya adalah dua pernyataan, {}; dan +" bar";, dengan rel blok dan unary +. Tanda kurung yang disebutkan Bergi menjadikannya Ekspresi dan {} dan Object literal. ({}) + " bar" menghasilkan "[object Object] bar".   -  person Jonathan Lonowski    schedule 04.11.2014
comment
@JonathanLonowski Terima kasih atas klarifikasinya! Sekarang saya mengerti mengapa NaN adalah outputnya; {} mengembalikan undefined karena sebenarnya ini adalah pemanggilan sebuah blok, mengembalikan undefined, yang kemudian diubah menjadi angka, dan karena + "bar" diubah menjadi NaN secara terpisah sebagai angka juga, jumlahnya juga NaN.   -  person Kaushik Shankar    schedule 05.11.2014


Jawaban (1)


Ini memastikan bahwa ekspresi selalu dievaluasi sebagai string, mencegah misalnya. penambahan numerik, bukan penggabungan. Dalam kasus di mana string hanya berisi satu ekspresi yang diinterpolasi, string juga secara efektif mengonversi ekspresi tersebut menjadi string. Beberapa contoh:

x = 2
y = 3

typeof "#{x}" is string   # true since this compiles to "" + x

str2 = "#{x}#{y}" # We want the string "23" here, not the number 5
person Joe Lee-Moyet    schedule 05.11.2014