Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么CoffeeScript';s字符串插值用空字符串作为表达式的前缀?_Javascript_String_Coffeescript_String Interpolation - Fatal编程技术网

Javascript 为什么CoffeeScript';s字符串插值用空字符串作为表达式的前缀?

Javascript 为什么CoffeeScript';s字符串插值用空字符串作为表达式的前缀?,javascript,string,coffeescript,string-interpolation,Javascript,String,Coffeescript,String Interpolation,在CoffeeScript中,以下语句计算为以空字符串为前缀的JavaScript语句 我觉得在类型安全方面有一个边缘案例,但我不能马上想到它。在什么情况下前缀会起作用 咖啡脚本: x = "#{foo} bar" JavaScript: x = "" + foo + " bar"; 它确保表达式始终作为字符串进行计算,例如防止数值相加而不是串联。在字符串仅包含单个插值表达式的情况下,它还有效地将该表达式转换为字符串。举几个例子: x = 2 y = 3 typeof "#{x}" is

在CoffeeScript中,以下语句计算为以空字符串为前缀的JavaScript语句

我觉得在类型安全方面有一个边缘案例,但我不能马上想到它。在什么情况下前缀会起作用

咖啡脚本:

x = "#{foo} bar"
JavaScript:

x = "" + foo + " bar";

它确保表达式始终作为字符串进行计算,例如防止数值相加而不是串联。在字符串仅包含单个插值表达式的情况下,它还有效地将该表达式转换为字符串。举几个例子:

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

我不是100%确定,但值得注意的是我尝试过的这段代码:
{a:'y'}+“thing”
=>NaN但是
“+{a:'y'}+”thing”
=>“[对象]thing”。因此,我的猜测是,将一个对象连接到一个空字符串会在连接之前调用对象上的
toString
。它考虑到的步骤7和8,并确保连接(7)与添加(8)的对比。一个人为的例子是
“{3}{4}”
。如果表达式开头有空字符串(
“”+3+4
),则会产生
“34”
。如果没有它(
3+4
),结果是
7
@Brennan:No。您被
{a:'y';}
作为块语法(请参阅)。试试
({a:'y'})+“thing”
@JonathanLonowski,完美的解释,谢谢。还有,Bergi,谢谢,非常感谢know@KaushikShankar使用
{}
会增加一些额外的复杂性,因为它们在JavaScript中有两种用途。当单独编写时,
{}+“bar”
实际上是两条语句,
{}
+“条”,带有和。Bergi提到的括号使它成为表达式,
{}
成为
对象
文本
({})+“bar”
生成
“[object]bar”