เหตุใดการแก้ไขสตริงของ CoffeeScript จึงนำหน้านิพจน์ด้วยสตริงว่าง

ใน CoffeeScript คำสั่งต่อไปนี้ประเมินเป็นคำสั่ง JavaScript ที่นำหน้าด้วยสตริงว่าง

ฉันรู้สึกเหมือนมีข้อดีในเรื่องความปลอดภัย แต่ฉันก็คิดไม่ออก คำนำหน้าสร้างความแตกต่างในกรณีใด

คอฟฟี่สคริปต์:

x = "#{foo} bar"

จาวาสคริปต์:

x = "" + foo + " bar";

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


คำตอบ (1)


ช่วยให้มั่นใจว่านิพจน์จะได้รับการประเมินเป็นสตริงเสมอ เพื่อป้องกันเช่น การบวกตัวเลขแทนการต่อข้อมูล ในกรณีที่สตริงมีนิพจน์ที่ประมาณค่าเพียงนิพจน์เดียว ก็จะแปลงนิพจน์นั้นเป็นสตริงได้อย่างมีประสิทธิภาพด้วย ตัวอย่างบางส่วน:

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