2014-11-04 4 views
0

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

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

CoffeeScript:

x = "#{foo} bar" 

JavaScript:

x = "" + foo + " bar"; 
+2

Я не 100% уверен, но стоит отметить, что это немного кода, который я пробовал: '{а:«у»} +« что „' => NaN но '“» + {a: 'y'} + "thing" '=> " [объект Object] вещь ". Поэтому я предполагаю, что объединение объекта в пустую строку вызывает 'toString' объекта перед конкатенацией – Brennan

+3

Он рассматривает шаги 7 и 8 [' '' '' '' '' оператора] (http://ecma-international.org/ecma- 262/5.1/# сек-11.6.1) и обеспечивает конкатенацию (7) по сравнению с добавлением (8). Надуманным примером является '' # {3} # {4} "'. С пустой строкой в ​​начале выражения ('" "+ 3 + 4'), это приводит к' '34" '. Без него ('3 + 4') результатом будет' 7'. –

+2

@Brennan: Нет. Вы стали жертвой '{a: 'y';}', являющегося блочным синтаксисом (см. [Эти] (http://stackoverflow.com/q/14115902/1048572) [вопросы] (http: /stackoverflow.com/q/17268468/1048572)). Попробуйте '({a: 'y'}) +" вещь "' – Bergi

ответ

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 
Смежные вопросы