Почему интерполяция строк CoffeeScript ставит перед выражением пустую строку?

В CoffeeScript следующий оператор оценивается как оператор JavaScript, перед которым стоит пустая строка.

Я чувствую, что есть крайний случай в отношении безопасности типов, но я не могу думать об этом с головы до ног. В каком случае префикс имеет значение?

Кофейный скрипт:

x = "#{foo} bar"

JavaScript:

x = "" + foo + " bar";

person Kaushik Shankar    schedule 04.11.2014    source источник
comment
Я не уверен на 100%, но стоит отметить этот кусок кода, который я пробовал: {a:'y'}+" thing" => NaN, но ""+{a:'y'}+" thing" => [object Object]. Итак, я предполагаю, что объединение объекта с пустой строкой вызывает 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, отличное объяснение, спасибо. Кроме того, Берги, спасибо, приятно знать   -  person Brennan    schedule 04.11.2014
comment
Спасибо @JonathanLonowski за ссылку на определение оператора! Я наконец понял, что здесь происходит! Загвоздка здесь в том, что с {} + " bar" на самом деле происходит то, что он переходит в 8-й вариант (преобразование в число), который, в свою очередь, пытается преобразовать ToPrimitive объекта в число, которое, в свою очередь, является NaN!   -  person Kaushik Shankar    schedule 04.11.2014
comment
@KaushikShankar Использование {} добавляет дополнительную сложность, поскольку в JavaScript у них есть 2 применения. Когда написано отдельно, {} + " bar" фактически представляет собой два оператора, {}; и +" bar";, с заблокировать и унарный +. Упомянутая Берги скобка делает его выражением, а {} - литералом 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