ใน CoffeeScript คำสั่งต่อไปนี้ประเมินเป็นคำสั่ง JavaScript ที่นำหน้าด้วยสตริงว่าง
ฉันรู้สึกเหมือนมีข้อดีในเรื่องความปลอดภัย แต่ฉันก็คิดไม่ออก คำนำหน้าสร้างความแตกต่างในกรณีใด
คอฟฟี่สคริปต์:
x = "#{foo} bar"
จาวาสคริปต์:
x = "" + foo + " bar";
{a:'y'}+" thing"
=› NaN แต่""+{a:'y'}+" thing"
=› สิ่ง [วัตถุวัตถุ] ดังนั้นฉันเดาว่าการเชื่อมต่อวัตถุเข้ากับสตริงว่างจะเรียกtoString
บนวัตถุก่อนที่จะต่อข้อมูล - person Brennan   schedule 04.11.2014+
และรับประกันการต่อข้อมูล (7) กับการบวก (8) ตัวอย่างที่วางแผนไว้คือ"#{3}#{4}"
ด้วยสตริงว่างที่จุดเริ่มต้นของนิพจน์ ("" + 3 + 4
) ผลลัพธ์จะเป็น"34"
หากไม่มี (3 + 4
) ผลลัพธ์จะเป็น7
- person Jonathan Lonowski   schedule 04.11.2014{a:'y';}
ที่ถูกบล็อกไวยากรณ์ (ดู สิ่งเหล่านี้ คำถาม) ลอง({a:'y'})+" thing"
- person Bergi   schedule 04.11.2014{} + " bar"
สิ่งที่เกิดขึ้นจริงคือมันจะเข้าสู่ตัวเลือกที่ 8 (การแปลงเป็นตัวเลข) ซึ่งจะพยายามบังคับ ToPrimitive ของวัตถุเป็นตัวเลข ซึ่งในทางกลับกันคือ NaN! - person Kaushik Shankar   schedule 04.11.2014{}
เพิ่มความซับซ้อนเพิ่มเติมเนื่องจากมีการใช้งาน 2 ครั้งใน JavaScript เมื่อเขียนด้วยตัวมันเอง{} + " bar"
คือสองคำสั่ง{};
และ+" bar";
โดยมี บล็อก และ unary+
. วงเล็บที่ Bergi กล่าวถึงทำให้เป็น นิพจน์ และ{}
และObject
ตัวอักษร({}) + " bar"
ผลลัพธ์ใน"[object Object] bar"
- person Jonathan Lonowski   schedule 04.11.2014NaN
จึงเป็นเอาต์พุต{}
ส่งคืนundefined
เนื่องจากจริงๆ แล้วเป็นการเรียกใช้บล็อก โดยส่งคืนundefined
ซึ่งจากนั้นจะถูกแปลงเป็นตัวเลข และเนื่องจาก+ "bar"
ถูกแปลงเป็นNaN
แยกกันเป็นตัวเลขเช่นกัน ผลรวมของมันคือNaN
เช่นกัน - person Kaushik Shankar   schedule 05.11.2014