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";
{a:'y'}+" thing"
=› NaN tetapi""+{a:'y'}+" thing"
=› [objek Objek] . Jadi tebakan saya adalah menggabungkan objek ke string kosong memanggiltoString
pada objek sebelum penggabungan - person Brennan   schedule 04.11.2014+
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
), hasilnya7
. - person Jonathan Lonowski   schedule 04.11.2014{a:'y';}
menjadi sintaks blok (lihat ini pertanyaan). Coba({a:'y'})+" thing"
- person Bergi   schedule 04.11.2014{} + " 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{}
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{}
danObject
literal.({}) + " bar"
menghasilkan"[object Object] bar"
. - person Jonathan Lonowski   schedule 04.11.2014NaN
adalah outputnya;{}
mengembalikanundefined
karena sebenarnya ini adalah pemanggilan sebuah blok, mengembalikanundefined
, yang kemudian diubah menjadi angka, dan karena+ "bar"
diubah menjadiNaN
secara terpisah sebagai angka juga, jumlahnya jugaNaN
. - person Kaushik Shankar   schedule 05.11.2014