Javascript 为什么CoffeeScript';s字符串插值用空字符串作为表达式的前缀?
在CoffeeScript中,以下语句计算为以空字符串为前缀的JavaScript语句 我觉得在类型安全方面有一个边缘案例,但我不能马上想到它。在什么情况下前缀会起作用 咖啡脚本: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
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”
。