В CoffeeScript следующий оператор оценивается как оператор JavaScript, перед которым стоит пустая строка.
Я чувствую, что есть крайний случай в отношении безопасности типов, но я не могу думать об этом с головы до ног. В каком случае префикс имеет значение?
Кофейный скрипт:
x = "#{foo} bar"
JavaScript:
x = "" + foo + " bar";
{a:'y'}+" thing"
=> NaN, но""+{a:'y'}+" thing"
=> [object Object]. Итак, я предполагаю, что объединение объекта с пустой строкой вызывает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{}
добавляет дополнительную сложность, поскольку в JavaScript у них есть 2 применения. Когда написано отдельно,{} + " bar"
фактически представляет собой два оператора,{};
и+" bar";
, с заблокировать и унарный+
. Упомянутая Берги скобка делает его выражением, а{}
- литераломObject
.({}) + " bar"
приводит к"[object Object] bar"
. - person Jonathan Lonowski   schedule 04.11.2014NaN
является выходом;{}
возвращаетundefined
, потому что на самом деле это вызов блока, возвращающийundefined
, который затем преобразуется в число, а поскольку+ "bar"
преобразуется вNaN
отдельно как число, его сумма также равнаNaN
. - person Kaushik Shankar   schedule 05.11.2014